【问题标题】:What is the end of the road for a WM_LBUTTONUP or WM_LBUTTONDOWN in a low level procedure hook?低级过程挂钩中的 WM_LBUTTONUP 或 WM_LBUTTONDOWN 路的尽头是什么?
【发布时间】:2021-10-16 18:43:13
【问题描述】:

我正在使用 Win32 API 在 Windows 中编写一个低级鼠标钩子,我想根据特定条件截获按下或向上(仍未确定)的按钮。

为了定位自己,让我们考虑以下处理这些钩子的过程:

LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == 0) {
        // Only act on the left click up message:
        if (wParam == WM_LBUTTONUP) {
            // Logic would go here...
            // XXX
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

它主要按预期工作,当条件不满足时,过程通过CallNextHookEx() 调用下一个行,当找到不合格参数时,我有几个逻辑也去(例如,如果接收到按钮不是我要找的)。

但是,当谈到行尾时,我不知所措,换句话说:如果我在注册点击时做我想做的一切,我该如何发出信号?该过程是否应该返回任何特定的返回值?

例如,即使程序流通过处理事情和处理所有事情的路径,除非我不返回对下一个钩子的调用,否则左(或右,取决于)按钮会卡住,好像它从未发布过。

使用文件资源管理器进行测试,如果单击文件发生在文件上,则除非调用下一个挂钩,否则您将拖动文件。这是行为的一个简单示例,资源管理器显然需要处理 WM_LBUTTONUP 本身而不是拖动文件,但问题仍然适用,它是如何做到的?最后是什么?

sn-p 中的XXX 是该代码所在的位置,所有内容都已处理,因此鼠标应该是空闲的(未绑定到任何东西?),可能在那里有一个return;我就是不知道是什么。

【问题讨论】:

  • 如果你问你的函数在处理鼠标消息时应该返回什么,这取决于你是否想抑制鼠标消息。
  • 我想是的,在这种情况下,鼠标消息将被处理,因此应该被禁止。
  • 根据docs,一个函数......“可能返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。”跨度>
  • 显然没有适合所有情况的答案,因为某些应用程序使用鼠标向下,其他鼠标向上,其他两者。有些捕获鼠标或使用一些内部标志(例如in_drag_mode)。其他应用程序也可能使用计时器或拖动偏移量,并且可能还有其他挂钩。因此,当您弄乱另一个应用程序的期望时,您会得到像卡住的按钮一样的东西。你为什么要搞乱文件资源管理器的鼠标处理?这很可疑。
  • 你不应该在你的钩子过程中弄乱消息;它更适合获得某些事件的通知。如果您“吃掉”一条消息 - 您将破坏其他应用程序(如您所见)。查看docs.microsoft.com/en-us/windows/win32/shell/shell-exts,特别是-docs.microsoft.com/en-us/windows/win32/shell/…

标签: c++ c winapi mouse-hook


【解决方案1】:

我将在答案中编译 cmets,以便那些到达这里的人有一个清晰的视图。

@Vlad Feinstein 是对的,不要乱用钩子程序中的消息。

@Phil1970 给出了最准确的答案,因为每个应用程序都以自己的方式处理消息,所以没有一般​​的方法可以知道如何处理一个问题;从外部看,我们对它们的处理方式一无所知,例如触发了哪些状态标志或事件。

在这种特定情况下,我认为即使一个人拦截了与鼠标点击相关的所有消息也是不可能的,如果是这样的话,那就是过度设计了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多