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