WinAPI从虚拟密钥转换为C中的字符

时间:2017-01-28 15:28:35

标签: c string windows winapi unicode

我有一个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;
}

0 个答案:

没有答案