MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Высокая нагрузка на ЦП при выполнении программы"
Answer 927170
Не нужно вызывать GetAsyncKeyState в цикле только с целью глобального отлова нажатий клавиатуры или мыши. При таком способе у вас всегда программа либо слишком сильно нагружает процессор, либо недостаточно быстро реагирует на события. Вместо этого, используйте специально для этого предназначенный механизм, Low-level keyboard (mouse) hook:
#include <stdio.h> #include <stdlib.h> #include <Windows.h> bool state = false; LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam; if(p->vkCode == VK_F12) { state = !state; } break; } } return CallNextHookEx(NULL, nCode, wParam, lParam); } LRESULT CALLBACK LowLevelMouseProc( int nCode, WPARAM wParam,LPARAM lParam){ if (nCode == HC_ACTION) { switch (wParam) { case WM_LBUTTONDOWN: if(state != false) { //выполнить необходимые действия при нажатии кнопки мыши... } break; } } return CallNextHookEx(NULL, nCode, wParam, lParam); } int main(int argc, char* argv[]) { printf("Press F12 to activate / deactivate the script."); HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0); if(hook == NULL) { printf("Failed to install keyboard hook!\n"); getchar(); return 1; } hook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, 0, 0); if(hook == NULL) { printf("Failed to install mouse hook!\n"); getchar(); return 1; } MSG msg; while (!GetMessage(&msg, NULL, NULL, NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.