C++ 和原始输入 - raw->data.keyboard.VKey == VK_ESCAPE 是唯一有效的虚拟键

标签 c++ raw-input

请注意,我只测试了几个,但其中只有 VK_ESCAPE 可以工作。

我真正想要的是 VK_LWINVK_RWIN,但这些也不起作用:VK_CONTROLVK_LCONTROL, VK_MENU, VK_F1

我不明白为什么这些都不起作用,但 VK_ESCAPE 会起作用。

这里是总结代码:

case WM_INPUT:
{
    LPBYTE lpb = new BYTE[dwSize];
    PRAWINPUT raw = (PRAWINPUT)lpb;
    UINT Event;

    Event = raw->data.keyboard.Message;
    keyChar = MapVirtualKey( raw->data.keyboard.VKey, MAPVK_VK_TO_CHAR);
    delete[] lpb;

    if (Event == WM_KEYUP)
    {
        if (keyChar == VK_LWIN)
        {
            system("start c:\\windows\\notepad.exe"); // For debugging, temporary
        }
    }
    break;

这样做的目的是在用户按下 Windows 键时执行某些操作,在这种情况下,“某事”正在发送不同的输入,例如 ctrl+alt+end(这是我的 Launchy 热键)。使用 AutoHotkey 来执行此操作对我来说不是一个选项。如果这有所作为,我正在使用 Windows 10。

我通常为游戏和 3D 软件编写代码,这对我来说都是全新的。

最佳答案

为此您不需要 MapVirtualKey。

我怀疑 raw->data.keyboard.VKey 是一个虚拟代码。 VK_LWIN 和 VK_RWIN 是虚拟代码。然而,它们没有字符表示,因此 MapVirtualKey 对它们没有意义。 ESCAPE 在 ASCII 中有字符代码,因此它适用于您的情况。

因此你的代码应该看起来像:

case WM_INPUT:
{
    ...
    unsigned vkCode = raw->data.keyboard.VKey;

    if (Event == WM_KEYUP)
    {
        if (vkCode == VK_LWIN)
        {
            system("start c:\\windows\\notepad.exe"); // For debugging, temporary
        }
    }
    break;

关于C++ 和原始输入 - raw->data.keyboard.VKey == VK_ESCAPE 是唯一有效的虚拟键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35832409/

相关文章:

python - 原始输入处的 Nose 测试卡住

c++ - (Windows HID API)HidD_GetPreparsedData() 由于句柄不正确而在 WM_INPUT 消息处理程序中失败?

android - 如何将音频文件从原始文件夹保存到手机

C++ SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c) 2 个参数

c++ - 使用at获取opencv中的像素值

c++ - 为什么默认参数构造函数被称为默认构造函数

c++ - 如何在 Windows 上以编程方式等效地查询 proc 文件系统?

Python 通过写入 stdin 取消 raw_input/input?

python - python中的原始输入和多处理

c++ - 简单程序中奇怪的引用传递问题