MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Virtual-key codes, в файл не записываются несколько клавиш"
Answer 963930
Во первых, неправильно реализована проверка результата GetAsyncKeyState. Правильно должно быть как-то так:
if ((GetAsyncKeyState(i) & 0x8000) != 0){ //... }
Во вторых, вызывать в цикле GetAsyncKeyState только для отлова нажатия клавиш - так себе идея, вместо этого нужно использовать специальное средство, клавиатурный хук. То же самое можно сказать про гигантский switch с проверкой все возможных кодов спецсимволов, для этого есть специальные функции, MapVirtualKey и ToUnicodeEx. Все это уже многократно обсуждалось.
Пример:
#include <stdio.h> #include <stdlib.h> #include <Windows.h> wchar_t VKCodeToUnicode(UINT vkCode) { BYTE keyboardState[255]=""; wchar_t buf[5] = L""; short x; byte y; for (int i = 0; i < 255; i++) { if (i == VK_CAPITAL) { x = GetKeyState(i); } else { x = GetAsyncKeyState(i); } y = 0; if ((x & 0x8000) != 0) y = (BYTE)(y | 0x80); if ((x & 0x0001) != 0) y = (BYTE)(y | 0x01); keyboardState[i] = y; } ToUnicodeEx(vkCode, MapVirtualKey(vkCode, 0), keyboardState, buf, 5, 0, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), nullptr))); return buf[0]; } LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam; wchar_t c = VKCodeToUnicode(p->vkCode); wprintf(L"%lc\n",c); break; } } return CallNextHookEx(NULL, nCode, wParam, lParam); } int main(int argc, char* argv[]) { HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0); if (hook == NULL) { printf("Failed to install keyboard 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.