【发布时间】: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