【问题标题】:Obtaining the virtual key code from a WM_CHAR message从 WM_CHAR 消息中获取虚拟键码
【发布时间】:2011-12-02 17:41:43
【问题描述】:

我从 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_

【问题讨论】:

    标签: c++ winapi keyboard


    【解决方案1】:

    也许你可以使用MapVirtualKey

    我不确定如何从 lparam 中提取扫描码,因为文档没有说明 - 要么获取整个 lparam 并计算该函数知道要查看哪些位,要么使用位域结构并从中获取正确的位。我认为这些方法中的一个应该有效 - 尝试这两种方法应该不难。

    【讨论】:

      【解决方案2】:

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

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

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

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

        unsigned int virtualKey = MapVirtualKey(scancode,MAPVK_VSC_TO_VK);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 2011-06-22
        • 1970-01-01
        相关资源
        最近更新 更多