你应该打电话的原因CallNextHookEx
在您的钩子例程中,以便消息可以传递到可能安装的任何其他钩子。如果不这样做并不会阻止接收该消息的应用程序看到该消息。
The 的文档WM_NULL https://slatestarcodex.com/2015/10/31/ot32-when-hell-is-full-the-thread-will-walk-the-earth/#comment-255524解释如何阻止该消息:
例如,如果应用程序安装了 WH_GETMESSAGE 挂钩并希望阻止处理消息,则 GetMsgProc 回调函数可以将消息号更改为 WM_NULL,以便收件人将忽略它。
因此,更正后的代码应如下所示:
extern "C" __declspec(dllexport) LRESULT __stdcall meconnect(int code, WPARAM wParam, LPARAM lParam) {
if (code >= 0) {
LPMSG msg = (LPMSG)lParam;
if (msg->message == WM_LBUTTONDOWN) {
OutputDebugString(L"Mouse down event happened \n");
msg->message = WM_NULL;
return false;
}
}
return(CallNextHookEx(NULL, code, wParam, lParam));
}
但是,如果存在其他钩子,这可能会导致不一致的行为,因为另一个钩子是否看到WM_LBUTTONDOWN
or WM_NULL
将取决于钩链的顺序,这是不可预测的。最好尝试这样的事情:
extern "C" __declspec(dllexport) LRESULT __stdcall meconnect(int code, WPARAM wParam, LPARAM lParam) {
if (code >= 0) {
LPMSG msg = (LPMSG)lParam;
int result = CallNextHookEx(NULL, code, wParam, lParam);
if (msg->message == WM_LBUTTONDOWN) {
OutputDebugString(L"Mouse down event happened \n");
msg->message = WM_NULL;
}
return result;
}
return(CallNextHookEx(NULL, code, wParam, lParam));
}