[python-win32] Creating a process and getting a handle
Tim Golden
mail at timgolden.me.uk
Wed Jan 23 09:52:19 CET 2008
Mike Driscoll wrote:
> Hi,
>
> I am trying to get a handle on an external process (Internet Explorer 6 in
> this case) that I open using win32process. I need the handle so that I can
> make said process the top window. Here's what I've tried so far:
>
> <code>
>
> import win32process
> import win32gui
>
> info = win32process.CreateProcess(None, proc, None, None, 0,
> win32process.NORMAL_PRIORITY_CLASS, None, None,
> win32process.STARTUPINFO())
> handle = info[0]
>
> # attempt to make Internet Explorer 6 the Foreground Window
> win32gui.SetForegroundWindow(handle)
>
> </code>
>
> Unfortunately, this results in a traceback:
>
> Traceback (most recent call last):
> File "<pyshell#12>", line 1, in ?
> win32gui.SetForegroundWindow(info[2])
> error: (1400, 'SetForegroundWindow', 'Invalid window handle.')
>
> I can get the handle by doing this:
>
> hwnd = win32gui.FindWindow('IEFrame',None)
>
> But if there's multiple Explorer windows open, I may not get the window I
> want. That's why I would like to create my own so I can have what amounts
> to an "exclusive" handle to it. Any hints would be appreciated.
I thought I'd posted a How-Do-I? on this one, but obviously
not. At any rate, here's the code I intended to post up. Hope
it helps as a starting point:
<code>
import subprocess
import time
import win32con
import win32gui
import win32process
def get_hwnds_for_pid (pid):
def callback (hwnd, hwnds):
if win32gui.IsWindowVisible (hwnd) and win32gui.IsWindowEnabled (hwnd):
_, found_pid = win32process.GetWindowThreadProcessId (hwnd)
if found_pid == pid:
hwnds.append (hwnd)
return True
hwnds = []
win32gui.EnumWindows (callback, hwnds)
return hwnds
if __name__ == '__main__':
notepad = subprocess.Popen ([r"notepad.exe"])
#
# sleep to give the window time to appear
#
time.sleep (2.0)
for hwnd in get_hwnds_for_pid (notepad.pid):
print hwnd, "=>", win32gui.GetWindowText (hwnd)
win32gui.SendMessage (hwnd, win32con.WM_CLOSE, 0, 0)
</code>
TJG
More information about the python-win32
mailing list