如何解决C ++按下键
我正在编写一个程序,希望它能够读取按键。这样做很好,但是当我尝试获取所按下键的名称时遇到了麻烦。该代码仅在程序中间停止,并且在哪一部分运行都无法提供预期的输出。这是我的代码。
#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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。