2015-09-09 50 views
2

如何讓我的mousehook從一個單獨的線程回調,以避免它干擾我的主線程,並導致mouselag?如何讓我的鼠標從單獨的線程回調? C++

HHOOK Mousehook; 
int trial=0; //paintflag for testing 

LRESULT CALLBACK HookCallback(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
switch (wParam) 
{ 
case WM_LBUTTONDOWN: 
    trial = 1; //set paintflag 
    InvalidateRect(hWnd, NULL, TRUE); 
    break; 
case WM_RBUTTONDOWN: 
    PostQuitMessage(0); 
    break; 
default: 
    break; 
} 
return CallNextHookEx(Mousehook, nCode, wParam, lParam); 
} 

這是我具備的功能,它被稱爲與

Mousehook = SetWindowsHookEx(WH_MOUSE_LL, HookCallback, NULL, 0); 

但我不知道如何使所有到一個單獨的線程,單呼。

任何人都知道一個好方法?任何幫助將不勝感激,這是甚至可能是這樣嗎?

+3

創建一個調用'SetWindowsHookEx'的工作線程,然後進入消息循環('GetMessage' +'DispatchMessate',直到你想關閉線程)。 –

+0

謝謝你把我放在正確的軌道上:D如果你想有發佈答案的榮譽,你可以這樣做,或者只是複製粘貼我發佈的答案,所以你得到的信譽我的意思 – Charlie

回答

1

我發現如何去做。 ATLEAST現在,這是我做了我的mousehook指定線程,以便它可以在後臺運行:

宣佈我的鉤和回調例程

HHOOK Mousehook; 

LRESULT CALLBACK HookCallback(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    switch (wParam) 
    { 
    case WM_LBUTTONDOWN: //incase lmb down 
     // 
     break; 
    case WM_RBUTTONDOWN: //incase of rmb down 
     // 
     break; 
    default: 
     break; 
    } 

return CallNextHookEx(Mousehook, nCode, wParam, lParam); 
} 

這是舊聞然而,這樣這有什麼竅門?首先加穿線

#include <thread> 

using std::thread //for convenience 

那麼我們作出這樣的線程運行的功能:

void mhook() 
{ 
MSG msg; 
Mousehook = SetWindowsHookEx(WH_MOUSE_LL, HookCallback, NULL, 0); 
    while (GetMessage(&msg, NULL, 0, 0) > 0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
} 

這將讓線程等待msg'es。現在我們需要做的就是創建線程,象這樣:

thread listen(mhook); 

這將使一個線程,鉤子和監聽mouseactions,而不會干擾你的主線程。

相關問題