C++读取键盘事件
C++ read keyboard events
我是 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;
感谢任何帮助!
除了上面的注释之外,GetKeynameText
需要一个用于键名的缓冲区,所以不是:
LPWSTR key;
GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR) << 16, key, sizeof(key));
你想要这样的东西:
WCHAR key [128];
GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR) << 16, key, sizeof(key) / sizeof (WCHAR));
您也可以在写入后刷新 wcout
。
我是 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;
感谢任何帮助!
除了上面的注释之外,GetKeynameText
需要一个用于键名的缓冲区,所以不是:
LPWSTR key;
GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR) << 16, key, sizeof(key));
你想要这样的东西:
WCHAR key [128];
GetKeyNameTextW(MapVirtualKeyW(vk, MAPVK_VK_TO_CHAR) << 16, key, sizeof(key) / sizeof (WCHAR));
您也可以在写入后刷新 wcout
。