我想問一個關於我遇到的問題的問題。MouseProc(WH_MOUSE)事件觸發兩次
我使用下面的函數安裝WH_MOUSE鉤:
hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, dllInstance, threadId);
的線程ID使用GetWindowThreadProcessId函數被獲得。這是成功的,因爲鉤子只在我想要的過程中起作用。 dllInstance從DllMain入口點獲得。對於它的價值,hMouseHook位於共享數據段(#pragma data_seg(「。shared」))。下面的代碼示出了MouseHookProc即在上述調用SetWindowsHookEx呼叫提供:
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode < 0 || !isRunning())
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
switch (wParam) {
case WM_LBUTTONDOWN: {
OutputDebugStringA("Mouse button down!\n");
break;
}
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
測試時,isRunning()返回TRUE(I雙重檢查)。我的問題是,「鼠標按鈕按下!」每次按住鼠標左鍵時,消息將被打印兩次。爲什麼根據提供的代碼,這是否會發生?我目前正在使用一種解決方法,但想知道爲什麼會發生這種情況。
我在Visual Studio 2015中調試啓動程序(調用DLL的函數包含SetWindowsHookEx)並將其附加到我正在使用的進程(調試 - >附加到進程)。
在此先感謝您的回覆。
編輯:它似乎只有第一次調用nCode == HC_ACTION的過程。我想這是對我的問題的答案,但我想知道爲什麼我的過程與nCode == HC_NOREMOVE第二次調用?
我的期望是'HC_NOREMOVE'調用('PeekMessage'調用'PM_NOREMOVE')是第一個。我不知道爲什麼這是第二個電話。您可以忽略使用「HC_NOREMOVE」標誌的任何調用。 – 1201ProgramAlarm
這是完全正常的和[記錄的行爲](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644988(v = vs.85).aspx)。 –
@ 1201ProgramAlarm其實,我只是可惜地認爲它是第二,沒有檢查。你是對的,HC_NOREMOVE是第一個。現在我的問題仍然存在,爲什麼用HC_NOREMOVE消息調用我的過程?這段代碼的目的是什麼? –