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