Python ctypes:SetWindowsHookEx回调函数未被调用
我正在尝试用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接口。
1 个回答
除了 WH_KEYBOARD_LL 和 WH_MOUSE_LL 这两种情况,Windows 的钩子(hook)必须在一个 DLL 文件中实现,这个 DLL 会被 Windows 注入到每个应用程序的进程里。所以,你不能仅仅在你的程序里写一个回调函数,然后指望 Windows 会去执行它。
我想到了解决这个问题的两种方法:
写一个用 C 或 C++ 编写的 DLL,这个 DLL 里实现钩子功能,并通过某种方式与主程序进行进程间通信。然后在你的主程序中加载这个 DLL,并把它的模块句柄和在这个 DLL 中实现的钩子函数传递给 SetWindowsHookEx。
你可以试试 SetWinEventHook 函数,它可能能满足你的需求。WinEvent 钩子可以直接在你的主程序中实现。