C# захватить нажатие клавиши Ctrl+PageUp

У меня возникли проблемы с захватом нажатия клавиш Ctrl+PageUp в элементе управления ListView в приложении WinForms.

Я использую этот код для захвата нажатий клавиш -

private void ListViewEx_KeyDown(object sender, KeyEventArgs e)
{
...
if(e.Control){
if((e.KeyCode ^ Keys.Left) == 0)
    MessageBox.Show("Left"); //shows messagebox
else if((e.KeyCode ^ Keys.PageUp) == 0)
    MessageBox.Show("PageUp"); //does not
...
}

Нужно ли мне погружаться в WndProc для обработки этого ключа? Спасибо.


Изменить: я обнаружил, что это работает, проблема заключалась в том, чтобы заключить TabControl, обрабатывающий эти ключи, до того, как ListControl до них добрался.


person Axarydax    schedule 29.03.2010    source источник
comment
На самом деле, при дальнейшем изучении ваш код работает, когда я его тестирую. Что-то происходит в коде, который вы пропустили перед блоком if, что может каким-то образом помешать?   -  person Fredrik Mörk    schedule 29.03.2010
comment
нет, это не работает - у меня есть производный элемент управления ListView, и все комбинации клавиш работают, кроме Ctrl+PageUp или Ctrl+PageDown. Эти двое продолжают фокусироваться на каком-то другом элементе управления в форме.   -  person Axarydax    schedule 29.03.2010
comment
Хорошо, я только что сделал тестовое приложение, в котором все это работает, и когда я продолжил аренду, чтобы воспроизвести проблему, и добавил TabControl, я обнаружил, что это TabControl ест мои ключи.   -  person Axarydax    schedule 29.03.2010


Ответы (3)


Нет необходимости в WndProc:

if ((e.Modifiers & ModifierKeys) == Keys.Control && e.KeyCode == Keys.PageUp)
{
    // ctrl + page up was pressed
}
person Fredrik Mörk    schedule 29.03.2010

Аргумент e.KeyData включает ключи-модификаторы. Сделайте так, чтобы это выглядело так:

  if (e.KeyData == (Keys.Control | Keys.PageDown)) {
    // Do your stuff
    Console.WriteLine("Ctrl+PgDn");
  }
person Hans Passant    schedule 29.03.2010

проверить

Keys.Control | Keys.PageUp
person thelost    schedule 29.03.2010
comment
Это не сработает, так как событие KeyDown содержит информацию о том, какая клавиша вызвала событие, а не о том, какие клавиши нажаты в данный момент. Таким образом, вы получите два отдельных события KeyDown: одно для клавиши Control и одно для клавиши PageUp. - person Fredrik Mörk; 29.03.2010