Sign in to follow this  
Followers 0

SOLVED: Detect (Hook?) New Windows

5 posts in this topic

Posted (edited)

I want to be able to detect when a new application window appears and get information about it (Handle, Titlebar text, etc). I presume this has to be done with hooks or windows messages since it is outside the control of my code.

Help much welcome, Thanks.

Edited by adamski

Share this post


Link to post
Share on other sites



Posted

#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $hForm

$hForm = GUICreate('')
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), '_ShellHookProc')
_WinAPI_RegisterShellHookWindow($hForm)

While 1
    Sleep(100)
WEnd

Func _ShellHookProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hForm
            Switch $wParam
                Case $HSHELL_WINDOWCREATED

                    Local $Title = WinGetTitle($lParam)

                    If IsString($Title) Then
                        ConsoleWrite('Activated: ' & $Title & @CR)
                    EndIf
            EndSwitch
    EndSwitch
EndFunc   ;==>_ShellHookProc

Func OnAutoItExit()
    _WinAPI_DeregisterShellHookWindow($hForm)
EndFunc   ;==>OnAutoItExit

WinAPIEx.au3

Share this post


Link to post
Share on other sites

Posted

Perfect, thanks!

Share this post


Link to post
Share on other sites

Posted

This is not working when the autoit is running as "SYSTEM" and not as logged in User. Any idea anybody whats missing here ?

Share this post


Link to post
Share on other sites

Posted (edited)

This could also help - Basically a Process Monitor

ConsoleWrite(@CR)
ObjEvent("AutoIt.Error", "_DeBug"); capture any com errors just in case, this way the app wont crash.
Local $Obj = ObjGet("winmgmts:{impersonationLevel=impersonate}!" & @ComputerName & "rootcimv2")
Local $hObj = ObjCreate("WbemScripting.SWbemSink")

If IsObj($Obj) And IsObj($hObj) Then
ObjEvent($hObj, "SINK_")
$Obj.ExecNotificationQueryAsync($hObj, "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
$Obj.ExecNotificationQueryAsync($hObj, "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'")
Else
ConsoleWrite('! Failed to Create the Object')
EndIf

While 1
Sleep(10)
WEnd

Func SINK_OnObjectReady($OB)
Switch $OB.Path_.Class
Case "__InstanceCreationEvent"
ConsoleWrite("+ P_ID> " & $OB.TargetInstance.ProcessID & @CR)
ConsoleWrite("+ P_Name> " & $OB.TargetInstance.Name & @CR)
ConsoleWrite("+ P_Path> " & $OB.TargetInstance.ExecutablePath & @CR&'>---------------'&@CR)
Case "__InstanceDeletionEvent"
ConsoleWrite("- P_ID> " & $OB.TargetInstance.ProcessID & @CR)
ConsoleWrite("- P_Name> " & $OB.TargetInstance.Name & @CR)
ConsoleWrite("- P_Path> " & $OB.TargetInstance.ExecutablePath & @CR&'>---------------'&@CR)
EndSwitch
Return 1
EndFunc ;==>SINK_OnObjectReady

Func _Debug($oError)
ConsoleWrite( _
"!>##################### AUTOIT OBJECT ERROR ######################################" & @CRLF & _
"->err.number is : " & @TAB & $oError.number & @CRLF & _
"err.scriptline is : " & @TAB & $oError.scriptline & @CRLF & _
">err.retcode is : " & @TAB & $oError.retcode & @CRLF & _
"!>################################################################################" & @CRLF _
)
Return 0
EndFunc ;==>_Debug

Edited by PhoenixXL

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