Захват 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 отправляется на мэйнфрейм. Чем командные обработчики сделают все остальное. Нажатие клавиши никогда не поступит в элемент управления.

Другие вопросы по тегам