1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <windows.h> #include <stdio.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_KEYDOWN: if (wParam == 'A') { printf("'A' key pressed in this program!\n"); } break; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; }
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION) { KBDLLHOOKSTRUCT* pKeyboard = (KBDLLHOOKSTRUCT*)lParam; if (wParam == WM_KEYDOWN && pKeyboard->vkCode == 'A') { printf("Hook: 'A' key pressed!\n"); } } return CallNextHookEx(NULL, nCode, wParam, lParam); }
DWORD WINAPI ThreadFunc(LPVOID lpParam) { HHOOK hHook = SetWindowsHookEx(WH_KEYBOARD, HookProc, NULL, GetCurrentThreadId()); if (hHook == NULL) { printf("Failed to set hook!\n"); return 1; }
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
UnhookWindowsHookEx(hHook); return 0; }
int main() { const char CLASS_NAME[] = "SampleWindowClass";
WNDCLASS wc = { 0 }; wc.lpfnWndProc = WindowProc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
HWND hwnd = CreateWindowEx( 0, CLASS_NAME, "Thread Hook Example", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, wc.hInstance, NULL );
if (hwnd == NULL) { return 0; }
ShowWindow(hwnd, SW_SHOW);
HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL); if (hThread == NULL) { printf("Failed to create thread!\n"); return 1; }
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); return 0; }
|