gpt4 book ai didi

c++ - C++按下键

转载 作者:行者123 更新时间:2023-12-02 10:11:04 26 4
gpt4 key购买 nike

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

#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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com