Edit (Dec. 2009): There's a new version in the German Forum . Enjoy!
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 …
Code:
; 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:
Code:
[Dialoge]
Number_of_dialogs=2
Title1=System-PIN
Text1=System-PIN speichern?
Keys1=1234{TAB} {ENTER}
Title2=Sonic RecordNow!
Text2=&Nein
Keys2=n