从WM_CHAR消息中获取虚拟密钥代码

时间:2011-10-07 04:19:17

标签: c++ winapi keyboard

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

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

EG:Game使用〜启用控制台,键绑定通过VK_OEM3和WM_KEYDOWN完成,但输入控制台的文本需要来自WM_CHAR的文本。

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

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

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

我读到你可以从第16-23位

获取Lparam的扫描码

但我不确定如何:

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

2 个答案:

答案 0 :(得分:4)

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

此代码将lParam的地址作为unsigned char数组(长度为一个字节),然后使用指针算术来寻址第3个字节(位16-23):

  unsigned char scancode = ((unsigned char*)&lParam)[2];

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

  unsigned int virtualKey = MapVirtualKey(scancode,MAPVK_VSC_TO_VK);

答案 1 :(得分:2)

也许你会使用MapVirtualKey

我不确定如何从lparam中提取scancode,因为文档没有说明 - 要么获得整个lparam并计算此函数知道要查看哪些位,要么使用bitfield struct并从中获取正确的位。我认为这些方法应该起作用 - 尝试两者都不应该是困难的。