0

我正在使用以下代码来获取键盘状态的 unicode 字符串:

std::wstring App::DecodeMessage(KBDLLHOOKSTRUCT* kbHook) {
    // Clean up the keyboard state
    for(int i=0; i<256; ++i) keyboardMap[i] = 0;

    // Get the state of all the virtual keys
    GetKeyboardState(keyboardMap);

    // Then we get the current layout setting
    HKL kbdLayout = GetKeyboardLayout(0);

    // We create the buffer to receive the unicode chars
    std::vector<wchar_t> buffer;
    buffer.resize(257);
    buffer.assign(257, L'\0');

    // And finally we translate all this to an unicode char
    int numberOfChars = ToUnicode(kbHook->vkCode, kbHook->scanCode, keyboardMap, &buffer[0], 256, 0);

    if(numberOfChars >= -1 && numberOfChars <= 0) return std::wstring(L"");

    return std::wstring(&buffer[0], numberOfChars);
}

我的键盘布局是 US-INTL,并且在没有运行应用程序的情况下,当我按下“'”(简单引号)时,在第二次击键时按下“a”,我得到了 á。但是,使用此功能,当我按下“'”(再次简单引用)时,我实际上会在我关注的任何应用程序中获得另一个单引号。此外,它似乎没有正确编码,因为它不会记录á。我一无所知,有人可以帮忙吗?

4

1 回答 1

0

所以我终于把它整理成不使用 ToUnicode。我最终使用了 Marc-André Moreau 创建的解决方案,如果有人感兴趣,可以在http://keymagic.googlecode.com/svn-history/r112/trunk/KeyMagicDll/kbdext.cpp找到。

于 2013-09-24T18:42:18.520 回答