通过TranslateAccelerator检测快捷方式时,忽略Shift键的状态

Ignoring the status of Shift key when detecting shortcuts via TranslateAccelerator

本文关键字:Shift 状态 忽略 TranslateAccelerator 检测 快捷方式 通过      更新时间:2023-10-16

我被卡住了:如何防止在加速器翻译过程中考虑虚拟移位键?例如,如果我的加速器表包含 ctrl a 的单个条目(要选择当前集中的窗口中的所有内容,请说(,那么我希望检测到相应的命令当 ctrl a 被按下以及 ctrl shift a a 被按下(但相反,我仍然想要 alt 键才能扮演其角色,因此 ctrl shift> shift a a shound不会翻译为我的命令(。

这篇文章无济于事。我认为我仍在消息循环时正在调用TranslateAccelerator功能(请参见下面的代码,如果我错了,请纠正我(。

当我看到WM_KEYDOWN消息时,我尝试通过获得当前键盘状态来超越窗口,手动将虚拟移动键状态更改为"未按下",进行加速器翻译,然后恢复我的手动修改。在代码中:

BOOL CHexaEditor::PreTranslateMessage(PMSG pMsg){
    // pre-processing the Message
    if (::GetFocus()==m_hWnd){ // I'm not sure if this is mandatory in MFC
        if (pMsg->message==WM_KEYDOWN){
            BYTE keyboardState[256];
            ::GetKeyboardState(keyboardState);
            const BYTE shiftState0=keyboardState[VK_SHIFT];
            keyboardState[VK_SHIFT]=0; // 0 = "not pressed"
                const BOOL result=::TranslateAccelerator(m_hWnd,hDefaultAccelerators,pMsg);
            keyboardState[VK_SHIFT]=shiftState0;
            ::SetKeyboardState(keyboardState);
            return result;
        }else
            return ::TranslateAccelerator(m_hWnd,hDefaultAccelerators,pMsg);
    }else
        return FALSE;
}

到目前为止还没有成功,任何帮助都高度赞赏。谢谢: - (

,因此正确答案是(感谢上面的ybungalobill(:

BOOL CHexaEditor::PreTranslateMessage(PMSG pMsg){
    // pre-processing the Message
    if (::GetFocus()==m_hWnd){
        if (pMsg->message==WM_KEYDOWN){
            BYTE keyboardState[256];
            ::GetKeyboardState(keyboardState);
            const BYTE shiftState0=keyboardState[VK_SHIFT];
            keyboardState[VK_SHIFT]=0;
/* --> */   ::SetKeyboardState(keyboardState); // this line was missing
                const BOOL result=::TranslateAccelerator(m_hWnd,hDefaultAccelerators,pMsg);
            keyboardState[VK_SHIFT]=shiftState0;
            ::SetKeyboardState(keyboardState);
            return result;
        }else
            return ::TranslateAccelerator(m_hWnd,hDefaultAccelerators,pMsg);
    }else
        return FALSE;
}
相关文章: