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

Obtaining the virtual key code from a WM_CHAR message

本文关键字:获取 虚拟 密钥 代码 消息 WM CHAR      更新时间:2023-10-16

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

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

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

当WM_KEYDOWN首先发生时,控制台被激活,然后一个WM_CHAR的~被发送到控制台缓冲区,这是我不想要的。

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

是否有办法从WM_CHAR消息中获得VK_ ?

我读到你可以从Lparam中获得16-23位的扫描码

但我不确定如何:

  1. 从lparam
  2. 中提取扫描码的值
  3. 正确地将扫描码转换为VK_

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

下面的代码以unsigned char数组(长度为一个字节)的形式获取lParam的地址,然后使用指针算术来寻址第3个字节(16-23位):

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

这段代码从扫描码转换为虚拟密钥:

  unsigned int virtualKey = MapVirtualKey(scancode,MAPVK_VSC_TO_VK);

也许你可以使用MapVirtualKey

我不确定如何从lparam中提取扫描代码,因为文档没有说明-要么获得整个lparam并计算该函数知道要查看哪些位,要么使用位域结构并从中获取正确的位。