【发布时间】:2014-06-07 17:52:31
【问题描述】:
我正在尝试挂钩所有鼠标移动事件,但我从未收到任何消息。这是完整的代码:
#include <Windows.h>
#include <windowsx.h>
#include <iostream>
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (wParam != WM_MOUSEMOVE)
{
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
std::cout << GET_X_LPARAM(lParam) << std::endl;
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_MOUSEMOVE:
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
std::cout << xPos << " - " << yPos << std::endl;
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow)
{
AllocConsole();
HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, hInstance, NULL);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
【问题讨论】:
-
对于全局挂钩,您的挂钩过程必须位于可加载模块 (DLL) 中。您的
MouseHookProc应始终致电CallNextHookEx,除非您希望完全过滤掉该消息。在后一种情况下,您的钩子过程应该返回一个非零值。不满足要求会破坏系统中的其他钩子。请务必仔细阅读LowLevelMouseProc。我刚才所说的一切都在那里拼写出来。 -
@IInspectable 询问者正在使用低级挂钩
-
@David 好点。对于低级挂钩,挂钩过程不需要驻留在 DLL 中。其余要求仍然有效,
MouseHookProc需要修复。
标签: winapi visual-c++