Игнорирование статуса клавиши Shift при обнаружении ярлыков через TranslateAccelerator - PullRequest
0 голосов
/ 04 июля 2019

Я застрял: как я могу предотвратить рассмотрение виртуальной клавиши Shift при переводе акселератора?Например, если моя таблица акселераторов содержит одну запись Ctrl + A (например, чтобы выбрать все в текущем фокусированном окне), я бы хотел, чтобы соответствующая команда была обнаружена, когда Ctrl + A , а также если нажата Ctrl + Shift + A (но, напротив, явсе еще хочу, чтобы клавиша Alt сыграла свою роль, поэтому Ctrl + Shift + A не переводится в мою команду).

Этот пост не помог.Я думаю, что я вызываю функцию TranslateAccelerator, пока я все еще в цикле сообщений (см. Код ниже и исправьте меня, если я ошибаюсь).

Я попытался перехитрить Windows, получив текущую клавиатурустатус, когда я вижу сообщение WM_KEYDOWN, вручную меняю статус виртуальной клавиши Shift на «не нажата», делаю перевод акселератора и отменяю свои ручные изменения.В коде:

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

Пока безуспешно, любая помощь высоко ценится.Спасибо: -)

1 Ответ

1 голос
/ 04 июля 2019

Итак, правильный ответ (спасибо ибунгалобилл выше):

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...