Python ctypes:从不调用SetWindowsHookEx回调函数

时间:2011-06-23 18:21:20

标签: python windows winapi events pywin32

我正在尝试用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年(pre windows 7?),虽然我不知道这是不是问题。

所以,我的问题是,任何人都可以找到代码工作的原因,或者2.告诉我另一种方法来实现我正在做的事情(最好是用Python,但如果必要的话,我会去其他语言)

编辑:是否可以使用WMI执行我想要的操作?我不太了解WMI,但我知道它确实有非常好的Python界面。

1 个答案:

答案 0 :(得分:2)

除了WH_KEYBOARD_LL和WH_MOUSE_LL之外,Windows挂钩必须在Windows注入每个应用程序进程的DLL中实现。因此,您不能简单地在程序中实现回调,并希望Windows能够运行它。

我可以想出两种方法来解决这个问题:

  1. 用C或C ++编写实现钩子过程的DLL,并通过某种形式的进程间通信通知主程序。然后在主程序中加载此DLL并将其模块句柄和该DLL中实现的钩子过程传递给SetWindowsHookEx。

  2. SetWinEventHook函数可以为您提供所需的内容。 WinEvent挂钩可以在您的主程序中实现。