【发布时间】:2020-12-13 13:17:06
【问题描述】:
我是 C++ 新手,我正在尝试制作一个读取击键的程序。这是我创建的一个查找某个键的函数。
void printKey(short vk)
{
if ((GetAsyncKeyState(vk) >> 15) & 1)
{
LPWSTR key;
GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR) << 16, key, sizeof(key));
wcout << key;
}
}
我知道密钥检测有效,因为我在 if 语句中放置了仅打印 true 或 false 的代码,因此我知道该部分正在工作。例如,当我输入“s”时,如果我传入虚拟键代码 0x53(s 的虚拟键代码),它将打印 true。一旦我知道该部分有效,我就尝试使用 MapVirtualKeyW 和 GeyKeyNameTextW 函数来获取密钥的名称,这样我就不必对所有这些进行硬编码。代码编译但在打印 Running....
这是完整的代码
#include <iostream>
#include <Windows.h>
#pragma comment(lib, "User32.lib")
using std::cout;
using std::endl;
using std::wcout;
void printKey(short vk)
{
if ((GetAsyncKeyState(vk) >> 15) & 1)
{
LPWSTR key;
GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR) << 16, key, sizeof(key));
wcout << key;
}
}
int main()
{
cout << "Running...." << endl;
while (true)
{
for (int i = 48; i <= 90; i++)
{
printKey(i);
}
}
return 0;
}
范围 48-90 用于所有字母和数字键。这个想法是每当我按下一个键时,它都应该打印到控制台。
我很确定问题出在这段代码中
LPWSTR key;
GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR) << 16, key, sizeof(key));
wcout << key;
感谢任何帮助!
【问题讨论】:
-
附带说明,
if ((GetAsyncKeyState(vk) >> 15) & 1)也可以写成if (GetAsyncKeyState(vk) & 0x8000)或if (GetAsyncKeyState(vk) < 0) -
此外,在 ASCII 范围 48..90 中不仅有字母和数字,还有标点符号。 ASCII 字母和数字与其对应的虚拟键代码具有相同的数值,但 ASCII 范围 58-64 中的虚拟键未定义,因此您的循环将一些无效的虚拟键传递给
GetAsyncKeyState()。