Halwegs Fensterpflege ("Halwegs Window Care")
(Sorry, still in German :? )
Here are the keys to control Halwegs Fensterpflege:
SCROLLLOCK - record data from the actual window to create a new "care instruction" / Start a care procedure that needs a trigger (when caretime is set to 9999)
WIN-SCROLLLOCK - Manage care instructions
SHIFT-WIN-SCROLLLOCk - Reset all windows, so Window Care will think they are new.
F9 - reactivate/close tool tips
Older stuff:
Edit: A window specific time delay before sending the key sequence was added.
Use this script in order to kill dialog boxes and make automatic logins.
Here's how it works:
A timer examines every 200 milliseconds if a new window appears and in this cases compares it with stored samples. If the window title matches a saved before title string and the window text (WINGETTEXT) contains a saved before text string a key sequence stored before is sent. A couple of tool tips and beeps illustrate the scripts work. That's all.
The more challenging part was the automated collection of samples (by SCROLLLOCK-Key, pressed when a new dialog box is open). The dialog box should be recognized reliable, so there must be both a title match and a text match. To get a text match string the script sends the actual window text (WINGETTEXT) to a notepad window. So the user can select a part of that text in order to make a matching string.
Sometimes it's difficult to find the differences between the window texts of dialog boxes inside the same application. In this case it's recommended to use the Window Spy.
I'm sure there is some optimization potential …
; AutoHotkey Version: 1.0.40.11 ; Language: English ; Platform: WinXP ; Author: halweg ; Send keysequences to dialog boxes ;************************************************************************************** ;******************************* Initialization *************************************** ;************************************************************************************** ;!!! Change the next two lines as required !!! inifile = %A_MYDOCUMENTS%\Hotkey-Skripte\komforteingabe.ini title_of_a_new_notepad_window = Unbenannt - Editor COORDMODE, TOOLTIP, SCREEN SETTITLEMATCHMODE, 1 DETECTHIDDENTEXT, ON ;*** Read saved keysequences number_of_dialogs := my_iniread("Dialoge", "Number_of_dialogs") LOOP, %number_of_dialogs% { wtitle%A_INDEX% := my_iniread("Dialoge", "Title" . A_INDEX) wtext%A_INDEX% := my_iniread("Dialoge", "Text" . A_INDEX) wkeys%A_INDEX% := my_iniread("Dialoge", "Keys" . A_INDEX) } ;*** Start the dialog-watching last_id = leer SETTIMER, handle_dialog_boxes, 200 RETURN ;************************************************************************************** ;*************************** Timed dialogbox handler ********************************** ;************************************************************************************** handle_dialog_boxes: ;*** It's time so look for new active windows new_id := WINACTIVE("A") IF new_id <> %last_id% { last_id =%new_id% ;*** A new window was found - Now: Compare the active window's title with all saved titles one by one LOOP, %number_of_dialogs% { IF WINACTIVE(wtitle%A_INDEX%) { keys_to_send := wkeys%A_INDEX% title_to_watch := wtitle%A_INDEX% text_to_watch := wtext%A_INDEX% ;*** Window title found - Now: Does it contain the right text? WINGETTEXT, act_wintext, A IFINSTRING, act_wintext, %text_to_watch% { ;*** The text is ok - Now: Do we need a SLEEP? IFINSTRING, keys_to_send, SLEEP { STRINGLEFT, sleeptime, keys_to_send, 4 STRINGTRIMLEFT, keys_to_send, keys_to_send, 9 SLEEP, %sleeptime% } ;*** SLEEP was done - Now: Send the keys my_beeps(2, 70) timed_tooltip("Sending """ . keys_to_send . """", 2000) SEND, %keys_to_send% ;*** Keys was sent - Now: Watch the dialogbox disappears WINWAITCLOSE, %title_to_watch%, %text_to_watch%, 2 IF ERRORLEVEL = 1 MSGBOX, No success!`nThe actual Window couldn't be handled by ""%keys_to_send%"" } } } } RETURN ;************************************************************************************** ;************************* Registration of a new dialog-handling keysequence ********** ;************************************************************************************** SCROLLLOCK:: my_beeps(1, 70) ;*** 1. Analyse the current active window (dialogbox to be registered) WINGETTITLE, new_title, A WINGETTEXT, all_window_text, A ;*** 2. User should select a significant piece of text from the dialogbox window by notepad CLIPBOARD = RUN notepad.exe WINWAITACTIVE, %title_of_a_new_notepad_window% SETKEYDELAY, -1 SEND, %all_window_text% SETKEYDELAY, 10 MSGBOX, Plese select (by mouse) a significant piece (maximum one line) of text to identify the dialogbox in future`nThen press OK SEND, ^c new_text = %CLIPBOARD% ;*** Close notepad without changes SEND, !{BS}!{F4} ;*** 3. User should input the keysequence for future handling of the dialogbox INPUTBOX, new_keys, Dialog-Box Handler for %new_title%, ( Please enter a keyssequence that should handle this dialogbox in future. Use AHK - codes. If the dialogbox needs a delay, include a SLEEP time in ms. EXAMPLES: my_name{TAB}my_password{ENTER} 2500SLEEP{TAB}1234{ENTER} ) IF ERRORLEVEL = 0 { IF new_keys = MSGBOX, Please Enter at least one key! ELSE { ;*** 4. Test the new keysequence, ask if the dialogbox was handled successful WINACTIVATE, %new_title% keys_to_send = %new_keys% IFINSTRING, new_keys, SLEEP { STRINGLEFT, sleeptime, new_keys, 4 STRINGTRIMLEFT, keys_to_send, new_keys, 9 SLEEP, %sleeptime% } my_beeps(2, 70) timed_tooltip("Sende" . keys_to_send, 5000) SEND, %keys_to_send% MSGBOX, 36, Successful dialogbox handling?, Save new Keysequence? IFMSGBOX, Yes { ;*** 5. Save dialogbox data new_number_of_dialogs := number_of_dialogs + 1 INIWRITE, %new_number_of_dialogs%, %inifile%, Dialoge, Number_of_dialogs INIWRITE, %new_title%, %inifile%, Dialoge, Title%new_number_of_dialogs% INIWRITE, %new_text%, %inifile%, Dialoge, Text%new_number_of_dialogs% INIWRITE, %new_keys%, %inifile%, Dialoge, Keys%new_number_of_dialogs% ;*** 6. Enable the handling of the new dialogbox in the current script wtitle%new_number_of_dialogs% := new_title wtext%new_number_of_dialogs% := new_text wkeys%new_number_of_dialogs% := new_keys number_of_dialogs := new_number_of_dialogs ;*** Enable the Dialogwatching of the new registred dialogbox timed_tooltip("The Window """ new_title """`nText """ new_text """`nin future will be handled by """ new_keys """",5000) my_beeps(1, 500) } } } RETURN ;************************************************************************************** ;********************************** Functions **************************************** ;************************************************************************************** ;*** This function makes a number of beeps my_beeps(number, duration) { LOOP, %number% { SOUNDBEEP, 650, %duration% SLEEP, 50 } } ;*** This function shows a tooltip and will close it later timed_tooltip(text, milliseconds=2000) { TOOLTIP, %text%, 0, 0 SETTIMER, close_tooltip, %milliseconds% } close_tooltip: ;*** Closes the standard tooltip SETTIMER, close_tooltip, Off TOOLTIP RETURN ;*** This function reads a value from the inifile and will finish the script if ERROR value detected my_iniread(m_section, m_key) { global inifile INIREAD, m_value, %inifile%, %m_section%, %m_key% IF m_value = ERROR { MSGBOX, An Error was encountered while reading inifile`nKey: %m_key% ,`nsection:%m_section% ,`nfile:%inifile% EXITAPP } ELSE RETURN %m_value% }
The samples are stored in an ini-file like this:
[Dialoge] Number_of_dialogs=2 Title1=System-PIN Text1=System-PIN speichern? Keys1=1234{TAB} {ENTER} Title2=Sonic RecordNow! Text2=&Nein Keys2=n