从WM_CHAR消息中获取虚拟密钥代码
Obtaining the virtual key code from a WM_CHAR message
我从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位的扫描码
但我不确定如何:
- 从lparam 中提取扫描码的值
- 正确地将扫描码转换为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并计算该函数知道要查看哪些位,要么使用位域结构并从中获取正确的位。
相关文章:
- C++ 如何从虚拟类的模板化子类中获取数据?
- 在 C++ 中将函数获取和设置为虚拟函数
- 如果我有指向基类对象的指针,如何获取虚拟方法的地址?
- 通过覆盖虚拟函数来获取'unresolved external symbol'
- 从 SIOCGIFCONF 和 SIOCGIFADDR 获取的 Solaris SPARC 中虚拟接口的接口名称不正确
- 在代码中获取虚拟值C++而不是预期值
- 在 Linux C++ 中获取虚拟内存最大映射计数
- 当试图检测基类是否具有虚拟破坏者时,如何获取正确的编译器错误消息
- 正在获取虚拟表指针c++
- 获取虚拟破坏者的重新定义错误
- 如何获取"direct"函数指向虚拟成员函数的指针?
- 如何通过基类从派生类中获取成员(使用纯虚拟的除外)
- 有没有任何方法可以从C++中的char中获取虚拟密钥代码
- 获取指向虚拟方法的指针
- 如何通过虚拟寻址区域中的指针获取物理寻址区域中的地址
- 如何从虚拟密钥代码中获取密钥文本
- 从 DLL (C++) 获取虚拟类接口
- 获取虚拟机内物理处理器的数量
- 从WM_CHAR消息中获取虚拟密钥代码
- 在两个项目之间链接时,获取虚拟函数的链接错误