Jump to content
Sign in to follow this  
SublimePorte

Window Handle from PID

Recommended Posts

SublimePorte

I have a program which could have several instances open, all of which would appear the same through winmatch of titles/classes etc.

Is there a away to get a handle for the window when launching it via it's PID?

Share this post


Link to post
Share on other sites
SublimePorte

I ended up writing my own function and luckily I did...

That function in the FAQ doesn't seem to have a timeout, which could result in endless loops.

Also some processes seem to be attached to more than one window. Try running that function with notepad for instance, just hangs for me.

Here's what I came up with:

Func WinHandFromPID($pid, $winTitle="", $timeout=8)
    Local $secs = 0
    Do
        $wins = WinList($winTitle)
        For $i = 1 To UBound($wins)-1
            If (WinGetProcess($wins[$i][1]) == $pid) And (BitAND(WinGetState($wins[$i][1]), 2)) Then Return $wins[$i][1]
        Next
        Sleep(1000)
        $secs += 1
    Until $secs == $timeout
EndFunc

Only get's the handle for visible windows.

Share this post


Link to post
Share on other sites
PsaltyDS

Only get's the handle for visible windows.

Only gets the handle for the FIRST visible window. As was pointed out earlier, a process can and often does have multiple windows. Try it this way:
#include <Array.au3>

; ...

; Returns an array of all Windows associated with a given process
Func WinHandFromPID($pid, $winTitle = "", $timeout = 8)
    Local $secs = TimerInit()
    Do
        $wins = WinList($winTitle)
        For $i = UBound($wins) - 1 To 1 Step -1
            If (WinGetProcess($wins[$i][1]) <> $pid) Or (BitAND(WinGetState($wins[$i][1]), 2) = 0) Then _ArrayDelete($wins, $i)
        Next
        $wins[0][0] = UBound($wins) - 1
        If $wins[0][0] Then Return SetError(0, 0, $wins)
        Sleep(1000)
    Until TimerDiff($secs) >= $timeout * 1000
    Return SetError(1, 0, $wins)
EndFunc   ;==>WinHandFromPID

:blink:

Edited by PsaltyDS

Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law

Share this post


Link to post
Share on other sites
Earthshine

oops, i was using this thread for another questions. sorry mods!

Edited by Earthshine

My resources are limited. You must ask the right questions

 

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  

×