在PreTranslateMessage(MSG *pMsg)
从 a 继承的 MFC 应用程序中CView
,我有这个:
if (pMsg->message == WM_KEYDOWN) ...
WM_KEYDOWN
a中的字段在此处记录。虚拟键值VK_
包含几个字段,其中16-23位是键盘扫描码pMsg->wParam
。pMsg->lParam
所以在我的代码中我使用:
const int virtualKey = pMsg->wParam;
const int hardwareScanCode = (pMsg->lParam >> 16) & 0x00ff; // bits 16-23
例如,在我的非美国键盘上,当我按下“#”字符时,我得到以下信息:
virtualKey == 0xde --> VK_OEM_7 "Used for miscellaneous characters; it can vary by keyboard."
hardwareScanCode == 0x29 (41 decimal)
我想“捕获”或以不同方式处理的字符是 ASCII“#”,0x23(十进制 35)。
我的问题
无论语言或键盘布局如何,如何翻译WM_KEYDOWN
信息以获得可以比较的内容?我需要确定#
用户是否拥有标准的美国键盘或不同的键。
例如,我一直在研究以下功能,例如:
MapVirtualKey(virtualkey, MAPVK_VSC_TO_VK);
// previous line is useless, the key VK_OEM_7 doesn't map to anything without the scan code
ToAscii(virtualKey, hardwareScanCode, nullptr, &word, 0);
// previous line returns zero, and zero is written to `word`
编辑:
长话短说:在美式键盘上,SHIFT+3 = #
,而在法语键盘上 SHIFT+3 = /
。所以我不想看单独的键,而是想了解角色。
在处理 WM_KEYDOWN 时,如何翻译 lParam 和 wParam(“键”)以找出键盘和 Windows 将要生成的字符?