我正在编写一个程序,希望它能够读取按键。这样做很好,但是当我尝试获取所按下键的名称时遇到了麻烦。代码只是在程序的中间停止,并且在哪一部分运行都无法提供预期的输出。这是我的代码。

#include <iostream>
#include <Windows.h>

#pragma comment(lib, "User32.lib")

using std::cout;
using std::endl;
using std::wcout;

void test(short vk)
{
    WCHAR key[16];
    GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR), key, _countof(key));
    wcout << "Key: " << key << endl;
}

int main()
{
    cout << "Running...." << endl;

    test(0x44); // Key: D
    test(0x45); // Key: E
    test(0x46); // Key: F

    return 0;
}
这给我的输出是
Running....
Key:
我期望的输出是
Running....
Key: D
Key: E
Key: F
或至少非常接近的东西。它应显示这三个十六进制数字代表D,E和F。
测试功能是我用来测试的功能,可以将虚拟键代码转换为它们代表的键,但到目前为止还没有成功。任何帮助表示赞赏!

最佳答案

阅读文档。 MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR) 不是GetKeyNameTextW()的有效输入,因为您正在将虚拟键代码映射到字符,但是 GetKeyNameTextW() 希望使用硬件扫描代码(在其他标志中),例如LPARAM消息的WM_KEY(DOWN|UP)
如果key[]失败,您也不能确保GetKeyNameTextW()缓冲区为空终止,因此您有将垃圾传递给std::wcout的风险。
在这种情况下,虚拟键码0x44 .. 0x46一旦由MapVirtualKeyW()转换后就可以原样输出,无需为它们使用GetKeyNameTextW(),例如:

void test(short vk)
{
    UINT ch = MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR);
    if (ch != 0) {
        wcout << L"Key: " << (wchar_t)ch << endl;
    }
    else {
        wcout << L"No Key translated" << endl;
    }
}

关于c++ - C++按下键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63570856/

10-10 05:43