【发布时间】:2017-04-23 07:30:21
【问题描述】:
我正在尝试创建一个窗口,然后获取创建的窗口的 hwnd。
目前,我调用subprocess.run("run.exe")创建窗口,然后继续调用wg.GetForegroundWindow()获取前景窗口的hwnd,这应该是新创建的窗口。然而,这并不能很好地工作,因为程序必须在它被检测为前景之前完成打开,同时用户可以改变焦点。
有没有更一致的方式来获取hwnd?
编辑: 以下是我在下面的 cmets 的帮助下正在做的事情:
def create_window():
user32 = ctypes.windll.user32
ole32 = ctypes.windll.ole32
EVENT_OBJECT_CREATE = 0x8000
def callback(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime):
if is_real_window(hwnd):
print(get_text(hwnd), "HOOKED")
user32.UnhookWinEvent(hWinEventHook)
return hwnd
WinEventProcType = ctypes.WINFUNCTYPE(
None,
ctypes.wintypes.HANDLE,
ctypes.wintypes.DWORD,
ctypes.wintypes.HWND,
ctypes.wintypes.LONG,
ctypes.wintypes.LONG,
ctypes.wintypes.DWORD,
ctypes.wintypes.DWORD
)
WinEventProc = WinEventProcType(callback)
user32.SetWinEventHook.restype = ctypes.wintypes.HANDLE
hook = user32.SetWinEventHook(
EVENT_OBJECT_CREATE,
EVENT_OBJECT_CREATE,
0,
WinEventProc,
0,
0,
0
)
if hook == 0:
print('SetWinEventHook failed')
sys.exit(1)
msg = ctypes.wintypes.MSG()
x = subprocess.Popen("C:\\cygwin64\\bin\\mintty.exe")
m = user32.GetMessageW(ctypes.byref(msg), 0, 0, 0)
但是,这面临两个问题。首先,虽然我可以在回调函数中访问 hwnd,但似乎没有办法让 create_window 返回这个值。其次,GetMessage 窗口继续运行,即使在调用 UnhookWinEvent 之后也是如此。
我能做些什么来解决这些问题?
【问题讨论】:
-
你控制两个进程的代码吗?
-
不确定你的意思。我控制调用 python 代码,但不控制正在执行的程序
-
你想用这个其他应用程序的窗口做什么?
-
我需要 hwnd 来执行各种功能。设置窗口样式,移动窗口等。因此,仅仅对创建的窗口进行一些操作是不够的;我需要 hwnd
-
WaitForInputIdle 和 EnumWindows