1 #include <iostream> 2 #include <windows.h> 3 4 5 LRESULT CALLBACK CallBackProc(int nCode, WPARAM wParam, LPARAM lParam) { 6 7 std::cout << "回調調用,線程ID:" << GetCurrentThreadId() << std::endl; 8 9 return CallNextHookEx(0, nCode, wParam, lParam); 10 } 11 12 int main() 13 { 14 15 //WH_KEYBOARD_LL 為全局鍵盤鈎子, WH_MOUSE_LL 為全局鼠標鈎子 16 //不管任何鈎子,回調函數的簽名都是一樣的,只不過如何解釋回調函數的參數有所不同 17 18 if (NULL == SetWindowsHookExW(WH_KEYBOARD_LL, CallBackProc, GetModuleHandleW(nullptr), 0)) { 19 20 std::cout << "Error Code:" << GetLastError() << std::endl; 21 } 22 else { 23 24 25 std::cout << "掛接成功,線程ID:" << GetCurrentThreadId() << std::endl; 26 while (true) 27 { 28 MSG msg; 29 GetMessageW(&msg, nullptr, 0, 0); 30 31 } 32 } 33 34 }
全局鍵盤鼠標鈎子,哪個線程掛的就會在哪個線程里調用回調函數,並不會注入其他進程中,所以控制台中若要使線程可以調用回調函數而不會一直阻塞,必須調用GetMessageW使線程進入消息循環,這樣才會生效
如果要設置全局鼠標鈎子只需要將SetWindowsHookExW的第一個參數改為WH_MOUSE_LL