在 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”获取快捷键失败?的主要内容,如果未能解决你的问题,请参考以下文章

在mfc中如何使用按钮依次输入数据

在共享DLL中使用MFC与在静态库中使用MFC的区别

在共享DLL中使用MFC与在静态库中使用MFC的区别

mfc中CClientDC(this)的this怎么获得?

mfc 图片列表显示

在mfc中控件如CButton,CStatic创建之后能改变大小或者移动位置吗