Sign in to follow this  
Followers 0
ptrex

Monitoring New Window Appear To Add A Ctrl - Using Anygui

4 posts in this topic

I need the view of someone more experienced in AutoIT GUI developer than I am, to solve my problem.

I am using the ANYGUI.au3 to add a CTRL to a window. This is working fine, so far;

My problem starts here.

I need to monitor wether the 'Windows Explorer' exists and than add the button, so far so good.

But I need to know as well if a second instance of the 'Windows Explorer' is opened or not.

And add a button to that 2nd instance.

When swithing between the 2 (or more ...) 'Explorer Windows', the button should appear all the time.

Look here for the code example to a button the the Windows File Explorer :

#include <ANYGUI.au3>
#include <guiconstants.au3>

Opt("WinTitleMatchMode", 4) 
Opt("GUIOnEventMode", 1) 

While 1
    $appWindow = WinGetHandle("classname=ExploreWClass")
;WinWaitActive("",$appWindow)
    If WinExists($appWindow) Then
        $Targetwindow = _GuiTarget($appWindow,"","FolderView",40960); mode 1 set so all '_Targetadd(s) go to this window
        $btn = _TargetaddButton ( "New Button", 740, 3, 80, 30,"","",$Targetwindow);
        GUICtrlSetOnEvent($btn[0], "Clicked") 
        GUISetState(@SW_SHOW)
    EndIf
    sleep(500)
WEnd


Func Clicked()
    $test=GUICtrlRead("Edit3")
MsgBox(0,"TEST","OK  "&$test)
EndFunc

The only solution I found is to put the script in a tight loop, to monitor wether the window exists and or the window is active.

BUT !! This tight loop locks up the windows which basically prevents anything else from happening.

Is there a solution to my problem ? :)

For example only monitor when an event happenes or something like that, rather than a tight loop ?

Share this post


Link to post
Share on other sites



I need the view of someone more experienced in AutoIT GUI developer than I am, to solve my problem.

I am using the ANYGUI.au3 to add a CTRL to a window. This is working fine, so far;

My problem starts here.

I need to monitor wether the 'Windows Explorer' exists and than add the button, so far so good.

But I need to know as well if a second instance of the 'Windows Explorer' is opened or not.

And add a button to that 2nd instance.

When swithing between the 2 (or more ...) 'Explorer Windows', the button should appear all the time.

Look here for the code example to a button the the Windows File Explorer :

#include <ANYGUI.au3>
#include <guiconstants.au3>

Opt("WinTitleMatchMode", 4) 
Opt("GUIOnEventMode", 1) 

While 1
    $appWindow = WinGetHandle("classname=ExploreWClass")
;WinWaitActive("",$appWindow)
    If WinExists($appWindow) Then
        $Targetwindow = _GuiTarget($appWindow,"","FolderView",40960); mode 1 set so all '_Targetadd(s) go to this window
        $btn = _TargetaddButton ( "New Button", 740, 3, 80, 30,"","",$Targetwindow);
        GUICtrlSetOnEvent($btn[0], "Clicked") 
        GUISetState(@SW_SHOW)
    EndIf
    sleep(500)
WEnd


Func Clicked()
    $test=GUICtrlRead("Edit3")
MsgBox(0,"TEST","OK  "&$test)
EndFunc

The only solution I found is to put the script in a tight loop, to monitor wether the window exists and or the window is active.

BUT !! This tight loop locks up the windows which basically prevents anything else from happening.

Is there a solution to my problem ? :)

For example only monitor when an event happenes or something like that, rather than a tight loop ?

I see a problem with the above code if I understand it correctly, for each time thru the loop it will create a new button the window if it exists.

You might want to think about using winlist, populate a hold array, each loop, populate another array with latest list, check against hold, see if new window exists, if it does add a button to it.

Just some quick thoughts

Gary


SciTE for AutoItDirections for Submitting Standard UDFs

 

Don't argue with an idiot; people watching may not be able to tell the difference.

 

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Ugly code but the idea is that one a new window appears, you add its handle to the list. Then you keep checking the list... However, handles are never removed from the list unless all explorer windows are closed:

#include <ANYGUI.au3>
#include <guiconstants.au3>

Opt("WinTitleMatchMode", 4)
Opt("GUIOnEventMode", 1)

Global $handleList = ""

While 1
    $appWindow = WinGetHandle("classname=ExploreWClass")
    If @error Then
        $handleList = "";no Explorer windows found, so clear the list
        sleep(500)
        ContinueLoop
    EndIf
    
;; CHECK WHETHER $handleList is up to date;;
    
;;;;ToolTip("DEBUG:  " & $handleList & "      " & $appWindow)
    
;If $appWindow is not in our list, add it
    If Not StringInStr($handleList, "|" & $appWindow) Then
        $handleList = $handleList & "|" & $appWindow
        Addbutton($appWindow)
    Else
;;MsgBox(4096,"debug","present")
    EndIf

;If $handleList has no-longer-existing enteries, remove them
;Doesn't work, possibly due to syntax or handle-string conversion issues
    #cs
    $rebuiltList = ""
    $array = StringSplit($handleList, "|")
    For $i = 1 to $array[0]
        If WinExists("handle=" & $array[$i]) Then $rebuiltList = $rebuiltList & "|" & $array[$i]
    Next
    $handleList = $rebuiltList
    #ce
    
    sleep(500)
WEnd


Func Clicked()
    $test=GUICtrlRead("Edit3")
MsgBox(0,"TEST","OK  "&$test)
EndFunc

Func AddButton($winhandle)
    Local $Targetwindow, $btn
    $Targetwindow = _GuiTarget($winhandle,"","FolderView",40960); mode 1 set so all '_Targetadd(s) go to this window
    $btn = _TargetaddButton ( "New Button", 740, 3, 80, 30,"","",$Targetwindow);
    GUICtrlSetOnEvent($btn[0], "Clicked")
    GUISetState(@SW_SHOW)
EndFunc

Edit: Similar to gafrost's idea.

Edited by CyberSlug

Use Mozilla | Take a look at My Disorganized AutoIt stuff | Very very old: AutoBuilder 11 Jan 2005 prototype I need to update my sig!

Share this post


Link to post
Share on other sites

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0