低级过程挂钩中 WM_LBUTTONUP 或 WM_LBUTTONDOWN 的尽头是什么?
What is the end of the road for a WM_LBUTTONUP or WM_LBUTTONDOWN in a low level procedure hook?
我正在使用 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()
调用下一个行收到按钮按下的进程不是我要找的进程)。
但是,当谈到行尾时,我不知所措,换句话说:如果我在注册点击时做我想做的所有事情,我该如何发出信号?该过程是否有任何特定的 return 值 return?
例如,即使程序流经过处理事情和处理所有事情的路径,除非我不 return 对下一个挂钩的调用左侧(或右侧,视情况而定)按钮卡住,就好像从未松开过一样。
使用文件资源管理器进行测试,如果单击发生在文件上,除非调用下一个挂钩,否则您将拖动文件。这是一个简单的行为示例,Explorer 显然需要处理 WM_LBUTTONUP
本身而不是拖动文件,但问题仍然存在, 它是如何做到的?最后是什么?
片段中的 XXX
是该代码所在的位置,所有内容都已处理,因此鼠标应该是自由的(未绑定到任何东西?),可能 return
在那里是有序的;我就是想不通是什么。
我会把评论整理成一个答案,让到这里的人看得清楚。
@Vlad Feinstein是对的,hook过程中的消息不要乱用。
@Phil1970 给出了最准确的答案,因为每个应用程序都以自己的方式处理消息,所以没有通用的方法可以知道一个人的处理方式;从外面看,我们对它们的处理方式一无所知,例如触发了哪些状态标志或事件。
在这种情况下,我认为即使拦截了 所有 与鼠标点击相关的消息也不可能,如果是的话过度设计。
我正在使用 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()
调用下一个行收到按钮按下的进程不是我要找的进程)。
但是,当谈到行尾时,我不知所措,换句话说:如果我在注册点击时做我想做的所有事情,我该如何发出信号?该过程是否有任何特定的 return 值 return?
例如,即使程序流经过处理事情和处理所有事情的路径,除非我不 return 对下一个挂钩的调用左侧(或右侧,视情况而定)按钮卡住,就好像从未松开过一样。
使用文件资源管理器进行测试,如果单击发生在文件上,除非调用下一个挂钩,否则您将拖动文件。这是一个简单的行为示例,Explorer 显然需要处理 WM_LBUTTONUP
本身而不是拖动文件,但问题仍然存在, 它是如何做到的?最后是什么?
XXX
是该代码所在的位置,所有内容都已处理,因此鼠标应该是自由的(未绑定到任何东西?),可能 return
在那里是有序的;我就是想不通是什么。
我会把评论整理成一个答案,让到这里的人看得清楚。
@Vlad Feinstein是对的,hook过程中的消息不要乱用。
@Phil1970 给出了最准确的答案,因为每个应用程序都以自己的方式处理消息,所以没有通用的方法可以知道一个人的处理方式;从外面看,我们对它们的处理方式一无所知,例如触发了哪些状态标志或事件。
在这种情况下,我认为即使拦截了 所有 与鼠标点击相关的消息也不可能,如果是的话过度设计。