問題:本來要編寫一個獲取系統空閒時間的DLL,但當安裝鼠標全局鉤子後,每當彈出窗口、或按下鍵盤win鍵、alt鍵等這些情況時,鼠標鉤子的(WM MOUSEMOVE)消息就會響應,這是經過多次測試才鎖定在這個消息上,非常奇怪這個情況,請大神們給予指導解惑
簡單列一下部分相關代碼:
// 全局變量
#pragma data_seg ("mkHook")
HHOOK g_hMyFreeMouse = NULL;
DWORD g_dFreeMouse = 0;
#pragma data_seg ()
// 設置鼠標鉤子
void SetMouseHook()
{
if (!g_hMyFreeMouse)
{
g_dFreeMouse=GetTickCount();
g_hMyFreeMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("mkHook"), NULL);
}
}
// 鼠標HOOK回調函數
LRESULT CALLBACK MouseProc(int code ,WPARAM wParam, LPARAM lParam)
{
if(wParam == WM_MOUSEMOVE)
{
g_dFreeMouse=GetTickCount(); // 這就是問題所在,沒有鼠標操作,也能執行這行代碼
}
return CallNextHookEx(g_hMyFreeMouse, code, wParam, lParam); // 繼續傳遞
}
// 卸載鼠標HOOK
void DestroyMouseHook()
{
if (g_hMyFreeMouse)
{
g_dFreeMouse=0;
UnhookWindowsHookEx(g_hMyFreeMouse);
g_hMyFreeMouse=NULL;
}
}
問題已解決,原來需要使用低層鉤子:WH-MOUSE-LL
將:SetWindowsHookEx(WH-MOUSE, MouseProc, GetModuleHandle("mkHook"), NULL);
改為:SetWindowsHookEx(WH-MOUSE-LL, MouseProc, GetModuleHandle("mkHook"), NULL);
注:沒辦法使用下劃線,就用“-”代替。