我有一个C程序,我注册了一个回调来监听VM_KEYDOWN事件
正确接收事件,对于每次按键,我都会获得虚拟密钥代码key
。现在我试图将这样的虚拟键码(它只是键盘上按钮的索引)转换为实际角色。我知道并非所有的键都返回一个字符(如“F2”),但我不在乎,我想尽可能将键码转换为字符
这就是我现在正在做的事情:
void ConvertKey(unsigned int key)
{
BYTE keyboardState[256];
WORD out;
GetKeyboardState(keyboardState);
int res = ToAsciiEx(key, MapVirtualKeyEx(key, 0, GetKeyboardLayout(0)), keyboardState, &out, 0, GetKeyboardLayout(0));
// out contains the character
}
在out
变量上我得到了角色,不幸的是它没有考虑SHIFT或CTRL所以如果我只是输入'a'或'A'(按SHIFT + a)我总是得到一个'一个'。
换句话说,它不会感知SHIFT(或我猜的是CTRL)并且不会输出正确的字符
修改
这里是我的消息泵和回调
LRESULT CALLBACK GetInput(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *keyboard = (KBDLLHOOKSTRUCT *)lParam;
if (wParam == WM_KEYDOWN)
{
ConvertKey(keyboard->vkCode);
}
return 0;
}
DWORD WINAPI MsgPump()
{
HHOOK hKeyHook;
HINSTANCE hExe = GetModuleHandle(NULL);
hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)GetInput, hExe, 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}