【问题标题】:Intercept all WM_MOUSEWHEEL messages拦截所有 WM_MOUSEWHEEL 消息
【发布时间】:2012-03-17 08:26:41
【问题描述】:

我一直在搜索 Windows API,寻找一种在所有 WM_MOUSESCROLL 消息到达其透视消息队列之前拦截它们的方法。拦截后,我需要更改一些关于它们的内容并将它们发送到不同的 [或相同的] 消息队列。

我需要相当有效地执行此操作,因为它将在相当大的应用程序之上运行。

关于如何实现这一目标的任何想法?我还没有找到方法。

【问题讨论】:

  • 你的意思是WM_MOUSEWHEEL?没有WM_MOUSESCROLL 消息。另外,当您说 all 时,是指全部用于您的线程、全部用于您的进程,还是全部用于整个系统?
  • 你说得对,我的意思是 WM_MOUSEWHEEL,我的意思是 ALL,整个系统,我真的很想成为第一个收到它的人。
  • 没有办法保证你是第一个收到它的(通过应用“如果两个程序这样做呢?”原则)。但是如果你使用一个低级的钩子,你会在输入系统调度它之前得到它,这可能已经足够好了。

标签: c# .net windows winapi


【解决方案1】:

您最好的选择是使用low level mouse event hook 进行非托管拦截。请参阅this MSKB article 了解更多信息。

【讨论】:

  • 我曾在以下 SO 回答中总结过那篇 MS 文章:stackoverflow.com/questions/7497024/how-to-detect-mouse-clicks/…
  • @ChristopheGeers:太棒了,比 MS 的可读性强得多
  • 我试过了,效果很好,但有 50% 的时间。有时我会在我尝试修改这些消息的窗口之前收到消息,有时在之后。这会改变应用程序所需的行为。顺便说一句,我不拥有窗户,但是,它的把手很容易接近。
  • @AdmiralNelson:那么钩子有问题,因为保证在将其发布到消息队列之前调用 LL 。您可能还想尝试WH_CALLWNDPROC,它会在所有消息被分派到 WndProc 之前获取它们。
【解决方案2】:

在使用 MFC 时,您可以使用PreTranslateMessage,或者在自定义框架中搜索WndProc 函数,看看它是否提供类似的功能。否则鼠标挂钩是个好主意。尤其是当您想在全球范围内进行时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多