如何检测窗口创建和关闭?

0 投票
1 回答
1220 浏览
提问于 2025-04-17 03:45

我找不到一种方法来添加一个回调函数,以便在窗口关闭时执行,而且也没有一个可靠的方法来响应新创建的窗口。

我的应用程序使用 subprocess.Popen 创建了一些进程。每个进程都有一个可见的窗口。这些进程通过 pyHook 共享一些事件,使用 PumpMessages 来实现。

我使用这个方法来获取每个窗口的句柄:Tim Golden: 找到我的子进程的窗口
这个方法首先会稍微等待一下,以便等窗口创建完成,然后使用 EnumWindows 并比较进程ID(pid)。好吧,这个方法有时候有效,只要给它足够的时间,但有时候又会等待得太久。显然,等待一个新窗口创建的通知会更好。

关闭窗口也是一样。我想我可以在 pyHook 事件中用 IsWindow 检查一个句柄,但这似乎不太对。我没有找到任何关于这个的 Python 示例,msdn 示例 说会发送 WM_CLOSE,但我无法让它监听任何消息(什么都没有发生,我只看到我的 pyHook 事件)。我甚至不确定我在这里是否正确使用了 HookMessage

def close_window(hwnd, msg):
    print "closed " + str(hwnd)

window = win32ui.CreateWindowFromHandle(hwnd)
# WM_CLOSE 0x0010
window.HookMessage(close_window,0x0010)

有没有办法添加一个回调函数,当一个进程创建窗口时执行?
我该如何在窗口关闭时执行一个回调函数?

1 个回答

1

我找到的唯一方法,就是使用Python和微软的一个叫做“活动可访问性层”的工具(pyAA)。这个项目现在已经不再维护了,所以你需要自己为你的Windows版本来构建它。不过,这就是我知道的唯一能让这个功能正常工作的办法。

撰写回答