hOOOKID.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. //7.Получение кода клавиши в формате ASCII и использованием Windows HOOK.Название клавиши выводить в MessageBox
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <windows.h>
  5. #define BUFFER_SIZE 256
  6. LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
  7. {
  8. if (nCode == HC_ACTION) {
  9. KBDLLHOOKSTRUCT* pKeyboardStruct = (KBDLLHOOKSTRUCT*)lParam;
  10. // Получение кода клавиши
  11. DWORD keyCode = pKeyboardStruct->vkCode;
  12. // Получение названия клавиши
  13. char keyName[256];
  14. UINT scanCode = MapVirtualKey(keyCode, MAPVK_VK_TO_VSC);
  15. GetKeyNameTextA(scanCode << 16, keyName, sizeof(keyName));
  16. // Вывод названия клавиши в MessageBox
  17. MessageBoxA(NULL, keyName, "Нажата клавиша", MB_OK);
  18. }
  19. // Передача управления следующему обработчику
  20. return CallNextHookEx(NULL, nCode, wParam, lParam);
  21. }
  22. int main()
  23. {
  24. system("chcp 1251");
  25. // Установка HOOK на клавиатуру
  26. HHOOK hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
  27. if (hKeyboardHook == NULL) {
  28. printf("Ошибка при установке HOOK на клавиатуру\n");
  29. return 1;
  30. }
  31. // Цикл сообщений
  32. MSG msg;
  33. while (GetMessage(&msg, NULL, 0, 0) > 0) {
  34. TranslateMessage(&msg);
  35. DispatchMessage(&msg);
  36. }
  37. // Удаление HOOK
  38. UnhookWindowsHookEx(hKeyboardHook);
  39. return 0;
  40. }
  41. //В этом исправленном коде мы используем функцию MapVirtualKey для преобразования кода клавиши в скан - код.Затем мы передаем полученный скан - код в функцию GetKeyNameTextA для получения названия клавиши.
  42. //
  43. //После внесения этих изменений, код должен корректно считывать и выводить названия клавиш при их нажатии.