В настоящее время я занимаюсь разработкой программы под названием «Key-O-Meter». Эта программа должна отслеживать каждый ввод, сделанный с помощью клавиатуры в Windows. Отслеживаемые ключи будут использоваться для создания статистики в другое время. К сожалению, я сталкиваюсь с проблемами в определении того, какой символ был напечатан. Приведенный ниже код печатает только символ на клавиатуре (т. Е. «A», если нажата a, но не «A», если нажаты shift + «a»). Специальные символы не работают вообще.
Есть ли лучшая функция WinAPI, чем MapVirtualKeyA
что обеспечивает эту функциональность?
#include <iostream>
#include <windows.h>
using namespace std;
LRESULT WINAPI lowLevelKeyboardProc(int nCode, WPARAM wParam,
LPARAM lParam);
/**
*
*/
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
//add hook
HHOOK hook;
hook = SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC) lowLevelKeyboardProc, NULL, 0);
//start message loop
MSG message;
while (GetMessage(&message, NULL, 0, 0) != 0) {
TranslateMessage(&message);
DispatchMessage(&message);
}
//disable hook
UnhookWindowsHookEx(hook);
return 0;
}
/**
*
*/
LRESULT WINAPI lowLevelKeyboardProc(int nCode, WPARAM wParam,
LPARAM lParam) {
if (wParam == WM_KEYDOWN) {
//handle normal keydown
PKBDLLHOOKSTRUCT hookStruct = (PKBDLLHOOKSTRUCT) lParam;
char keyChar = MapVirtualKeyA(hookStruct->vkCode, MAPVK_VK_TO_CHAR);
cout << keyChar << endl;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
MapVirtualKey () не может узнать, была ли нажата клавиша-модификатор. Вы можете посмотреть в ToAscii () или же ToUnicode () Оба они принимают состояние клавиатуры в качестве ввода.
Состояние клавиатуры можно получить с помощью GetKeyboardState () или же GetAsyncKeyState ()
Других решений пока нет …