2017-04-03 197 views
2

我想問一個關於我遇到的問題的問題。MouseProc(WH_MOUSE)事件觸發兩次

我使用下面的函數安裝WH_MOUSE鉤:

hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, dllInstance, threadId); 

線程ID使用GetWindowThreadProcessId函數被獲得。這是成功的,因爲鉤子只在我想要的過程中起作用。 dllInstanceDllMain入口點獲得。對於它的價值,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第二次調用?

+0

我的期望是'HC_NOREMOVE'調用('PeekMessage'調用'PM_NOREMOVE')是第一個。我不知道爲什麼這是第二個電話。您可以忽略使用「HC_NOREMOVE」標誌的任何調用。 – 1201ProgramAlarm

+0

這是完全正常的和[記錄的行爲](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644988(v = vs.85).aspx)。 –

+0

@ 1201ProgramAlarm其實,我只是可惜地認爲它是第二,沒有檢查。你是對的,HC_NOREMOVE是第一個。現在我的問題仍然存在,爲什麼用HC_NOREMOVE消息調用我的過程?這段代碼的目的是什麼? –

回答

0

用nCode == HC_NOREMOVE調用一次,然後再用nCode == HC_ACTION調用。