1

我正在使用 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);
}

它主要按预期工作,当条件不满足时,程序调用 next in line through CallNextHookEx(),当找到不合格的参数时,我有几个逻辑也会发生(例如,如果收到按钮按下的进程不是那个我在找)。

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

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

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

XXX在代码片段中是该代码所在的位置,所有内容都已处理,因此鼠标应该是空闲的(未绑定到任何东西?),可能areturn在那里是有序的;我就是想不通是什么。

4

1 回答 1

0

我将在答案中编译评论,以便到达这里的人有一个清晰的看法。

@Vlad Feinstein是对的,不应该在钩子程序中弄乱消息。

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

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

于 2021-09-01T20:16:01.163 回答