Python ctypes:SetWindowsHookEx回调函数从未被调用

4
我正在尝试编写一个Python程序,它可以检测到警报框/对话框的出现。它需要处理多个监视器,并且当任务栏图标闪烁、出现错误/通知等时,我希望它在辅助监视器上显示可视化效果。
据我所知,检测这些事件的方法是使用消息钩子,如此处所述:http://msdn.microsoft.com/en-us/library/ms632589%28v=vs.85%29.aspx 我甚至幸运地找到了一个示例,该示例从Python访问SetWindowsHookEx函数(此特定示例使用鼠标信号,但我只需更改常量以侦听不同的消息)。 http://www.python-forum.org/pythonforum/viewtopic.php?f=2&t=11154 然而,上面的示例不起作用。回调函数从未被调用,无论我的鼠标点击如何,中间鼠标点击也不会导致程序退出。
该示例来自2009年(Windows 7之前?),虽然我不知道是否是问题所在。
因此,我的问题是,有人能够1.找出代码为什么不起作用,或2.告诉我另一种实现我所需功能的方法(最好是用Python,但如果必要,我会尝试其他语言)。
编辑:使用WMI是否可以实现我想要的功能?我不了解WMI,但我知道它有非常好的Python接口。

2
那个示例中的 WH_MOUSE_LL 钩子是一个特殊情况,它不需要被注入到进程中才能工作;回调可以在调用模块中,但是对于 CBT 钩子,回调必须托管在 DLL 中。 - Alex K.
关于Python的WH_KEYBOARD_LL示例(就像WH_MOUSE_LL一样-无需DLL),请参见:https://dev59.com/Wmkw5IYBdhLWcg3wi7Jz#16430918 - totaam
1个回答

3
除了 WH_KEYBOARD_LL 和 WH_MOUSE_LL 之外,Windows 钩子必须在 Windows 注入到每个应用程序进程的 DLL 中实现。因此,你不能仅仅在你的程序中实现回调并期望 Windows 运行它。
我可以想到两种解决这个问题的方法: 1. 使用 C 或 C++ 编写一个 DLL,实现钩子过程并通过某种形式的进程间通信通知你的主程序。然后在你的主程序中加载该 DLL,并将其模块句柄和实现在该 DLL 中的钩子过程传递给 SetWindowsHookEx。 2. SetWinEventHook 函数可能会给你想要的结果。WinEvent 钩子可以在你的主程序中实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接