C++ & Raw Input - raw->data.keyboard.VKey == VK_ESCAPE 是唯一有效的虚拟键
C++ & Raw Input - raw->data.keyboard.VKey == VK_ESCAPE is the only virtual key that works
请注意,我只测试了几个,但其中只有 VK_ESCAPE
可以工作。
我真正想要的是VK_LWIN
和VK_RWIN
,但是这些也不起作用:VK_CONTROL
、VK_LCONTROL
、VK_MENU
、VK_F1
我不明白为什么 none 会起作用,但 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 键时执行某些操作,在这种情况下 'something' 正在发送不同的输入,例如 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;
请注意,我只测试了几个,但其中只有 VK_ESCAPE
可以工作。
我真正想要的是VK_LWIN
和VK_RWIN
,但是这些也不起作用:VK_CONTROL
、VK_LCONTROL
、VK_MENU
、VK_F1
我不明白为什么 none 会起作用,但 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 键时执行某些操作,在这种情况下 'something' 正在发送不同的输入,例如 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;