Я застрял: как я могу предотвратить рассмотрение виртуальной клавиши 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;
}
Пока безуспешно, любая помощь высоко ценится.Спасибо: -)