从WM_CHAR消息获取虚拟键码

4

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

我的目的是过滤掉VK_代码与绑定到启用文本输入控件的键相同的WM_CHAR消息。

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

由于WM_KEYDOWN先发生,因此会激活控制台,然后将~的WM_CHAR发送到控制台缓冲区,这是我不想要的。

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

是否有一种方法可以从WM_CHAR消息中获取VK_代码?

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

但是我不确定如何:

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

5

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

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

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

这段代码将扫描码转换为虚拟键:
  unsigned int virtualKey = MapVirtualKey(scancode,MAPVK_VSC_TO_VK);

2
也许你可以使用MapVirtualKey函数。
我不确定如何从lparam中提取扫描码,因为文档没有说明。你可以获取整个lparam并计算这个函数要查看哪些位,或者使用位域结构体并从中获取正确的位。我认为其中一种方法应该有效-尝试这两种方法都不难。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接