Sté*_*ane 4 windows winapi mfc keyboard-events scancodes
在PreTranslateMessage(MSG *pMsg)从 a 继承的 MFC 应用程序中CView,我有这个:
if (pMsg->message == WM_KEYDOWN) ...
Run Code Online (Sandbox Code Playgroud)
此处WM_KEYDOWN记录了 a中的字段。虚拟键值位于并包含多个字段,其中第 16-23 位为键盘扫描码。VK_pMsg->wParampMsg->lParam
所以在我的代码中我使用:
const int virtualKey = pMsg->wParam;
const int hardwareScanCode = (pMsg->lParam >> 16) & 0x00ff; // bits 16-23
Run Code Online (Sandbox Code Playgroud)
例如,在我的非美式键盘上,当我按下“#”字符时,我得到以下信息:
virtualKey == 0xde --> VK_OEM_7 "Used for miscellaneous characters; it can vary by keyboard."
hardwareScanCode == 0x29 (41 decimal)
Run Code Online (Sandbox Code Playgroud)
我想“捕获”或以不同方式处理的字符是 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`
Run Code Online (Sandbox Code Playgroud)
编辑:
长话短说:在美式键盘上, SHIFT+3 = #,而在法式键盘上 SHIFT+3 = /。所以我不想看单个键,而是想了解角色。
处理 WM_KEYDOWN 时,如何翻译 lParam 和 wParam(“键”)以找出键盘和 Windows 即将生成的字符?
我相信这是一个更好的解决方案。这个是用标准的美式键盘布局和加拿大-法语键盘布局测试的。
const int wParam = pMsg->wParam;
const int lParam = pMsg->lParam;
const int keyboardScanCode = (lParam >> 16) & 0x00ff;
const int virtualKey = wParam;
BYTE keyboardState[256];
GetKeyboardState(keyboardState);
WORD ascii = 0;
const int len = ToAscii(virtualKey, keyboardScanCode, keyboardState, &ascii, 0);
if (len == 1 && ascii == '#')
{
// ...etc...
}
Run Code Online (Sandbox Code Playgroud)
尽管帮助页面似乎暗示keyboardState调用 是可选的ToAscii(),但我发现它是我试图检测的字符所必需的。
| 归档时间: |
|
| 查看次数: |
2760 次 |
| 最近记录: |