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
我不明白为什么这些都行不通,但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 热键)。使用自动热键来执行此操作对我来说不是一个选择。我使用的是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;
相关文章:
- 使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault
- vk::D eviceQueueCreateFlags() 实际上做了什么?
- 为什么Visual Studio在调试时对ANSI Escape代码有不同的处理方式
- Qt4.8.6中的Qt::escape(const QString & plain)在哪里?
- VK API throught C++ Boost
- 如何防止MFC对话框在Enter键和Escape键上关闭
- 为什么我收到此代码的"unknown escape character"错误
- 解码字符UTF8 escape在Boost Spirit
- visual Escape C++中CString中的特殊字符
- 如何按Escape键重置QLineEdit文本