从 WM_CHAR 消息获取虚拟键码

Spe*_*ose 4 c++ keyboard winapi

我从 WM_CHAR 和 WM_KEYDOWN 消息获取文本输入和按键输入

我想要做的是过滤掉与绑定以启用您输入文本的控件的键具有相同 VK_ 代码的 WM_CHAR 消息。

EG:游戏使用~来启用控制台,按键绑定是通过VK_OEM3和WM_KEYDOWN完成的,但是输入到控制台的文本需要来自WM_CHAR的文本。

由于 WM_KEYDOWN 首先发生,控制台被激活,然后 ~ 的 WM_CHAR 被发送到我不想要的控制台缓冲区。

我认为防止这种情况的最佳方法是将 WM_CHAR 中的 VK_ 与控件的绑定键进行比较并将其过滤掉。

有没有办法从 WM_CHAR 消息中获取 VK_ ?

我读到您可以从 Lparam 的第 16-23 位获取扫描码

但我不确定如何:

  1. 从 lparam 中提取扫描码的值
  2. 将扫描码正确翻译为VK_

Spe*_*ose 5

经过一番折腾后,我设法使用以下代码提取虚拟密钥:

此代码获取 lParam 的地址作为无符号字符数组(一个字节长度),然后使用指针算术来寻址第三个字节(位 16-23):

  unsigned char scancode = ((unsigned char*)&lParam)[2];
Run Code Online (Sandbox Code Playgroud)

此代码从扫描码转换为虚拟键:

  unsigned int virtualKey = MapVirtualKey(scancode,MAPVK_VSC_TO_VK);
Run Code Online (Sandbox Code Playgroud)