在 MFC 的 PretranslateMsg 中使用“Alt + num”获取快捷键失败?
Posted
技术标签:
【中文标题】在 MFC 的 PretranslateMsg 中使用“Alt + num”获取快捷键失败?【英文标题】:Get shortcut key failed with "Alt + num" in PretranslateMsg in MFC? 【发布时间】:2014-04-08 02:35:41 【问题描述】:我想在 MFC 的 PretranslateMsg 中预处理键盘消息。所以我写了下面的代码。
if( pMsg->message == WM_KEYUP )
if( GetKeyState(VK_CONTROL) || GetKeyState(VK_SHIFT) || GetKeyState(VK_MENU) )
CString csKey = TranslateKeyToString( GetKeyState(VK_CONTROL) & 0x8000 ,GetKeyState(VK_SHIFT) & 0x8000, GetKeyState(VK_MENU)&0x8000, pMsg->wParam );
DoWorkForAcceleratorKey(csKey);
return TRUE;
上面的代码。我可以成功地在“csKey”中为“Ctrl+Alt+1”和“Ctrl+1”获得快照,但我无法获得“Alt+1”,当我按下 Alt+1 时,csKey 是一个奇怪的单个字符。 那么“Alt+1”会发生什么,以及如何解决这个问题? 谢谢。
【问题讨论】:
在 TranslateKeyToString 中放置一个断点并检查其参数。Alt+<key>
有点特别,因为它们通常用于导航主菜单,因此您可能会发现它们甚至在到达 PreTranslateMsg
之前就被过滤掉了。
【参考方案1】:
您没有收到 1 的 WM_KEYUP 消息。 使用 Alt 键,输入的字符以不同的方式使用。
您收到的是 WM_SYSKEYUP,而不是 WM_KEYUP。您收到的 WM_KEYUP 应该有 VK_MENU 的 nVirtKey 代码。
这是我在记事本中按 ALT+1 时 Spy++ 捕获的消息。
WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:1 fUp:0
WM_SYSKEYDOWN nVirtKey:'1' cRepeat:1 ScanCode:02 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
WM_SYSCHAR chCharCode:'49' (49) cRepeat:1 ScanCode:02 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
WM_SYSKEYUP nVirtKey:'1' cRepeat:1 ScanCode:02 fExtended:0 fAltDown:1 fRepeat:1 fUp:1
WM_KEYUP nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
WM_SYSKEYDOWN nVirtKey:VK_MENU cRepeat:1 ScanCode:38 fExtended:0 fAltDown:1 fRepeat:0 fUp:0
【讨论】:
以上是关于在 MFC 的 PretranslateMsg 中使用“Alt + num”获取快捷键失败?的主要内容,如果未能解决你的问题,请参考以下文章