当收到字符输入时,有没有办法知道wParam
中的字符代码是否是由于我们从GetKeyboardState()
返回的键盘状态而生成的?例如,如果您点击Ctrl+A
,那么字符“' a'不会是控制键的结果,但如果您使用瑞典语键盘并输入Ctrl+Alt+7
,结果将为{
。在这种情况下,有没有办法知道键盘状态(Ctrl
和Alt
)是否需要生成该字符代码?
答案 0 :(得分:1)
如果您只查看WM_CHAR
消息提供的数据,则不会。如果WM_KEY...
无法满足您的需求,您可能需要查看Get(Async)KeyboardState()
消息,以便跟踪周围按键所处的位置。
答案 1 :(得分:1)
(老实说,作为一个真正只使用美式键盘布局的英语使用者,我不知道这会起作用,但......)我相信VkKeyScan
功能(或VkKeyScanEx
)可能会做你想做的事。
作为输入,它需要一个字符,而不是扫描代码或虚拟键,因此这是您从wParam
获得的WM_CHAR
值。
它的返回值是一个值,它提供低字节的虚拟键代码(我猜你可以忽略)和(错误命名的)"移位状态"在高字节中,它实际上是一组表示生成该字符所需的限定符键的标志。
因此,如果您收到WM_CHAR
消息并想知道是否需要控制密钥才能生成它,理论上您可以这样做:
case WM_CHAR:
if (HIBYTE(VkKeyScan((TCHAR)wParam)) & 2) {
// control pressed!
}
break;