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
原文:https://www.cnblogs.com/leikaifeng/p/14123662.html