Захват Ctlr+Z в MFC
Я пытаюсь вырезать / копировать / вставить в моем приложении, и для этого мне нужно захватить Ctrl+Z и т. Д. Я написал следующий код в моем обработчике события OnKeyDown():
if(GetKeyState(VK_CONTROL)<0)
{
WPARAM wparam = (WPARAM(nChar));
switch(wparam)
{
case 'z':
//display message box
break;
default:
break;
}
}
Но моя проблема в том, что множественные нажатия клавиш никогда не фиксируются. Я могу зафиксировать нажатие одной кнопки для клавиши Ctrl или любой другой клавиши в этом отношении. Но если я нажимаю Ctrl+Z на моей клавиатуре, захватывается только Ctrl, а z игнорируется. Может ли кто-нибудь предложить лучший способ обработки нескольких нажатий клавиш?
2 ответа
Попробуй это:
if (GetKeyState(VK_CONTROL)&0x80)
{ if ((nChar==_T('z'))||(nChar==_T('Z')))
{ // indicate activity
Beep(800, 50);
}
}
Дополнительная информация:
Из MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).aspx
Функция GetKeyState
получает статус указанного виртуального ключа. Статус указывает, находится ли клавиша вверх, вниз или переключена (вкл, выкл - чередование при каждом нажатии клавиши).
Ключом для проверки является управляющий ключ, то есть: VK_CONTROL. Вы также можете обратиться к GetAsyncKeyState
для более поддерживаемого макроса имени ключа.
Операция (&0x80) проверяет один бит старшего разряда (MSB) SHORT (8-бит)
Возвращаемое значение: SHORT
Если старший бит равен 1, ключ не работает; в противном случае это вверх.
Если младший бит равен 1, ключ переключается
Когда Ctrl+Z находится в списке ускорителей (как вы написали в комментарии), вам не нужно обрабатывать последовательность управления. Вы получите сообщение WM_COMMAND со значением, определенным в списке акселераторов.
Ускорители позволяют намного проще и гибче обрабатывать нажатия клавиш. Если последовательность клавиш находится в списке акселераторов, сообщение транслируется в PreTranslateMessage, а сообщение WM_COMMAND отправляется на мэйнфрейм. Чем командные обработчики сделают все остальное. Нажатие клавиши никогда не поступит в элемент управления.