gpt4 book ai didi

windows - 如何从 PreTranslateMessage(MSG*pMsg) 中的 WM_KEYDOWN 中提取字符

转载 作者:可可西里 更新时间:2023-11-01 09:19:19 25 4
gpt4 key购买 nike

在从 CView 继承的 PreTranslateMessage(MSG *pMsg) 中的 MFC 应用程序中,我有这个:

if (pMsg->message == WM_KEYDOWN) ...

WM_KEYDOWN 中的字段已记录 here .虚拟键VK_的值在pMsg->wParam中,pMsg->lParam包含几个字段,其中第16-23位是键盘扫码。

所以在我的代码中我使用:

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 将要生成的字符?

最佳答案

我相信这是一个更好的解决方案。此键盘已使用标准美国键盘布局和加拿大-法语键盘布局进行了测试。

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...
}

即使帮助页面似乎暗示 keyboardState 对于 ToAscii() 的调用是可选的,但我发现它是我尝试的字符所必需的检测。

关于windows - 如何从 PreTranslateMessage(MSG*pMsg) 中的 WM_KEYDOWN 中提取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44660035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com