【问题标题】:C++ read keyboard eventsC++ 读取键盘事件
【发布时间】: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) &gt;&gt; 15) &amp; 1) 也可以写成if (GetAsyncKeyState(vk) &amp; 0x8000)if (GetAsyncKeyState(vk) &lt; 0)
  • 此外,在 ASCII 范围 48..90 中不仅有字母和数字,还有标点符号。 ASCII 字母和数字与其对应的虚拟键代码具有相同的数值,但 ASCII 范围 58-64 中的虚拟键未定义,因此您的循环将一些无效的虚拟键传递给 GetAsyncKeyState()

标签: c++ winapi keyboard


【解决方案1】:

除了上面的 cmets,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 后刷新它。

【讨论】:

  • 注意GetKeyNameText的最后一个参数用字符表示,而不是字节,所以调用Unicode版本时单独使用sizeof(key)是错误的。请改用_countof(key) 或等效项。
  • 冲洗它有什么作用,以及您是如何获得 128 码的?
  • Flushing wcout 写出所有缓冲的字符,以确保您看到它们。 128,我和好了。它需要“足够长”。
猜你喜欢
  • 2022-01-22
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
相关资源
最近更新 更多