AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Close annoying dialog boxes automatically
Goto page 1, 2  Next
 
Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions
View previous topic :: View next topic  
Author Message
halweg



Joined: 27 Jan 2005
Posts: 117
Location: Germany, Dresden

PostPosted: Sun Jan 15, 2006 11:49 pm    Post subject: Close annoying dialog boxes automatically Reply with quote

Edit (Dec. 2009): There's a new version in the German Forum . Enjoy!
Halwegs Fensterpflege ("Halwegs Window Care")

(Sorry, still in German Confused )

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


Last edited by halweg on Fri Dec 18, 2009 12:28 pm; edited 2 times in total
Back to top
View user's profile Send private message
halweg



Joined: 27 Jan 2005
Posts: 117
Location: Germany, Dresden

PostPosted: Wed Jan 18, 2006 11:52 am    Post subject: Reply with quote

I found some bugs, now they are removed. Cool

The script works fine, it saves me a lot of clicks and inputs. Very Happy
The last 3 days I found over a dozen dialogs to "kill". Whenever I close the script I feel myself like a windows beginner doing some very stupid things Mad


Last edited by halweg on Wed Jan 18, 2006 5:13 pm; edited 1 time in total
Back to top
View user's profile Send private message
Serenity



Joined: 07 Nov 2004
Posts: 1271

PostPosted: Wed Jan 18, 2006 4:50 pm    Post subject: Reply with quote

Hi halweg, I've always thought AutoHotkey would be perfect for this kind of thing. I tried your script but I get an error message saying:

Quote:
An Error was encountered while reading inifile
Key: Number_of_dialogs,
section:Dialoge,
file:settings.ini

_________________
"Anything worth doing is worth doing slowly." - Mae West
Back to top
View user's profile Send private message Visit poster's website
halweg



Joined: 27 Jan 2005
Posts: 117
Location: Germany, Dresden

PostPosted: Wed Jan 18, 2006 5:08 pm    Post subject: Reply with quote

Hi Serenity. I'm happy you try the script out.
There seems to be some problems with the ini-file:
Or the file or the section or the key or the value are not properly prepared.
See example in my post.
To start try an inifile like this:
Code:
[Dialoge]
Number_of_dialogs=0

Don't forget to customize the two lines at the begin of the script.
Halweg
Back to top
View user's profile Send private message
Serenity



Joined: 07 Nov 2004
Posts: 1271

PostPosted: Wed Jan 18, 2006 5:48 pm    Post subject: Reply with quote

Thanks, I added this to the top of your script so that the ini file is created if it doesn't exist:

Code:
setworkingdir, %A_ScriptDir%
ifnotexist, %inifile%
  fileappend, [Dialoge]`nNumber_of_dialogs=0, %inifile%

_________________
"Anything worth doing is worth doing slowly." - Mae West
Back to top
View user's profile Send private message Visit poster's website
halweg



Joined: 27 Jan 2005
Posts: 117
Location: Germany, Dresden

PostPosted: Wed Jan 18, 2006 6:12 pm    Post subject: Reply with quote

Thanks. The inifile is still the weakest point of the script.
It may happens that you must remove a bad registred dialogbox sample. Some annoying renumbering will be required. Mad
That's why I'll keep some focus to the inifile, that user should be abel to find and edit it.
Back to top
View user's profile Send private message
grossermanitu
Guest





PostPosted: Thu Jan 25, 2007 1:21 pm    Post subject: Reply with quote

the script is very cool.

but how do I write the below command in the dialogbox?:

send, name
send{ENTER}
sleep, 500
send{TAB}
Back to top
halweg



Joined: 27 Jan 2005
Posts: 117
Location: Germany, Dresden

PostPosted: Thu Jan 25, 2007 2:16 pm    Post subject: Reply with quote

This is still not possible in the above shown script.
But a workaround could be possible: if the dialogbox to handle changes it's text information after the {ENTER} (gathered by wingettext) this would be detectable by the script as a new dialog situation with the possibility of using the Sleep feature.
_________________
Back to top
View user's profile Send private message
noodleNT



Joined: 29 Aug 2007
Posts: 1

PostPosted: Wed Aug 29, 2007 10:27 pm    Post subject: Reply with quote

THIS IS GREAT!

I suggest adding one more thing. Keyboard and Mouse lockout. That way users can't mess around while an installation or something is going on.

This works great for those Driver Signing prompts!
Back to top
View user's profile Send private message
grossermanitu
Guest





PostPosted: Wed Jan 23, 2008 3:58 pm    Post subject: Reply with quote

I recovered just your great script. I am using it with my laptop. Unfortunately the intern sound of my laptop is very loud. How could I stop the repeatingly peep sound if the script detects an appropriate window?

And even though the sending of a keystoke was succesfull I will get the message: "No success! The actuall window couldnt be handled by "{enter}"
Back to top
Ye
Guest





PostPosted: Fri Jan 25, 2008 3:18 pm    Post subject: Reply with quote

Good script. This auto-close popup dialog is what I'm looking for.
Why?
Here, we have to run a kind of safety agent program before connecting to Internet. This program will shutdown the network connection if the socket- or some-kind-of- connections (sorry, that is not my major) are to much. A Warning dialog will popup and have to be closed before the computer can access to internet again. Therefore, during unmanned running, some downloading tools, eg. bitorrent tools or emule, can be blocked from the net. This script can close the warning dialog right after it appears.

But...
This script detects a new dialog/window that steals the focus. So, it won't work on those popups that do not take the focus, for example, the warning popup I want to kill here. When change the focus to my target using Alt-Tab, this script works very well.

Solution
I close all dialog/window before the unmanned downloading. When the Warning popup, aimed with Alt-Tab, this script shoots it down. After that, no window should be opened, or the focus will change. If the warning showup again, it will automatically come into focus and be closed. This may not be the best solution, but at least it works for the time being.

Ye
Back to top
JDP
Guest





PostPosted: Wed Jan 30, 2008 3:23 pm    Post subject: solution to multiline actions Reply with quote

Write them on one line with | for newline, then loop parse for | in the code
Back to top
glenviewjeff
Guest





PostPosted: Mon Mar 03, 2008 7:17 pm    Post subject: Easier Solution Reply with quote

From: http://www.autohotkey.com/docs/commands/SetTimer.htm


; Example #1: Close unwanted windows whenever they appear:
#Persistent
SetTimer, CloseMailWarnings, 250
return

CloseMailWarnings:
WinClose, Microsoft Outlook, A timeout occured while communicating
WinClose, Microsoft Outlook, A connection to the server could not be established
return
Back to top
tic



Joined: 22 Apr 2007
Posts: 1786

PostPosted: Mon Mar 03, 2008 9:11 pm    Post subject: Reply with quote

you might be able to improve this by using:

Code:
DllCall("RegisterShellHookWindow", "UInt", hwnd)
MsgNum := DllCall("RegisterWindowMessage", "Str", "SHELLHOOK")


instead of checking every 200ms. search the forums for others that have made versions that use this instead
Back to top
View user's profile Send private message
DeWild1



Joined: 30 Apr 2006
Posts: 358
Location: Shigle Springs

PostPosted: Mon Dec 01, 2008 5:36 pm    Post subject: Reply with quote

halweg, GREAT script, well thought out.

Mr. Tic is right.. Loops and stuff are heavy.. Shellhook is light.
http://www.autohotkey.com/forum/viewtopic.php?p=123323#123323
Code:

Gui +LastFound
hWnd := WinExist()

DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )

Return ;                                                 // End of Auto-Execute Section //

ShellMessage( wParam,lParam ) {
  If ( wParam = 4 ) ;  HSHELL_WINDOWACTIVATED
     {
       WinGetTitle, Title, ahk_id %lParam%

       If InStr( Title, "fire" )
          SetTimer, fire, -1

       If InStr( Title, "notepad" )
          SetTimer, notepad, -1

     }
}


fire:
 msgbox, fire
return

notepad:
 msgbox, Notepad
return


For IE and FF titles that change, replace
Code:
   If ( wParam = 4 ) ;  HSHELL_WINDOWACTIVATED
with this
Code:
 if Wparam in 1,4,6
for better results.


SKAN is a god!
_________________
CPULOCK.com
virusSWAT.com
Computer Repair Computer Service.com
911PCFIX.com
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group