【问题标题】:Python ctypes: SetWindowsHookEx callback function never calledPython ctypes:从未调用过 SetWindowsHookEx 回调函数
【发布时间】:2011-06-23 18:21:20
【问题描述】:

我正在尝试用 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 接口。

【问题讨论】:

  • 该示例中的 WH_MOUSE_LL 钩子是一种特殊情况,它不需要注入到进程中才能工作;回调可以在调用模块中,但是对于 CBT 挂钩,回调必须托管在 DLL 中。
  • 有关 Python 中出色的 WH_KEYBOARD_LL 示例(就像 WH_MOUSE_LL - 不需要 DLL),请参阅:stackoverflow.com/questions/9817531/…

标签: python windows winapi events pywin32


【解决方案1】:

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

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

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

  2. SetWinEventHook 函数可能会满足您的需求。 WinEvent 挂钩可以在您的主程序中实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-02-02
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多