2015-08-27 5 views
0

Я новичок в StackOverflow, и я надеюсь правильно написать вопрос.Как я могу избежать события KeyUp после того, как он был поднят после фильтрации оконного сообщения в переопределенном методе ProcessCmdKey?

Я пытаюсь реализовать сочетания клавиш в моем приложении winform.
Глядя в Microsoft MSDN documentation относительно управления вводом клавиатуры, я узнал, что можно перехватить давление ярлыков путем предварительной обработки соответствующего сообщения, отправленного в окно формы, в рамках переопределения метода ProcessCmdKey.
Поскольку я должен обрабатывать по-разному все остальные ключи, как отдельных лиц, так и их комбинации, посредством управления событиями KeyDown и KeyUp, мне нужно, чтобы эти события не запускались, когда вы нажимаете и отпускаете последнюю комбинацию клавиш.

Ниже приведен код, который обрабатывает ввод с клавиатуры:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == (Keys.Control | Keys.Shift | Keys.End)) 
     { 
      // now I need this to avoid making actions in the KeyUp event handler 
      //if (filterNextKeyUp == false) 
      //{ 
      // filterNextKeyUp = true; 
      //} 
      return true; 
     } 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 

    private void ClientForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     // do actions in reaction to key pressure 
    } 

    private void ClientForm_KeyUp(object sender, KeyEventArgs e) 
    { 
     // now I need this to avoid making actions in the KeyUp event handler.. 
     // but I would not enter here if a shortcut was intercepted!! 
     //if (filterNextKeyUp == true) 
     //{ 
     // filterNextKeyUp = false; 
     //} 
     //else 
     //{ 
      // do actions in reaction to key release 
     //} 
    } 

Таким образом, это происходит, что сообщение давления фильтруется ProcessCmdKey, а затем событие KeyDown не запускается, но вместо этого KeyUp событие запускается, когда вы отпускаете последний ключевой ярлык.

Как избежать события KeyUp, аналогично тому, как я фильтрую событие KeyDown?
Есть ли другой способ переопределить цель?

+1

Использование KeyUp, когда пользователь должен нажать 3 клавиши одновременно, не является хорошей идеей. Шансы, что он освобождает ключи в ожидаемом порядке, просто не очень хороши. Переопределение ProcessCmdKey() достаточно для обнаружения ярлыка, дополнительная обработка не требуется. –

+0

Здравствуйте, спасибо за ваш ответ! Да, вы правы, я не должен допускать порядок выпущенных ключей, и я должен сохранить, что выпустил ключ для фильтрации. Мне нужно знать, есть ли метод, в который я могу поймать сообщение окна, которое запускает событие KeyUp, таким же образом, что и я в ProcessCmdKey() для предотвращения событий KeyDown. :) –

+0

Мне совершенно непонятно, зачем это нужно. [Читать] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

ответ

0

Вам нужны «комбинированные кнопки», чтобы что-то сделать, когда они не объединены с Ctrl, Shift или End?

Если нет, то просто справиться с этими ключами в ProcessCmdKey, а также:

public static bool HandleProcessCmdKey(this IPAMålepunktGui guiMålepunkt, Keys keyData) 
     { 
      switch (keyData) 
      { 
       case Keys.Right: 
       case Keys.Right | Keys.Shift: 
       case Keys.Enter: 
        // go to next field 
        return guiMålepunkt.NæsteFelt(); 
       case Keys.Left: 
       case Keys.Left | Keys.Shift: 
        // go to previous field 
        return guiMålepunkt.ForrigeFelt(); 
       case Keys.Down: 
       case Keys.Down | Keys.Shift: 
       case Keys.Up: 
       case Keys.Up | Keys.Shift: 
        // disable native navigation 
        return true; 
       case Keys.Tab: 
       case Keys.Tab | Keys.Control: 
        // go to next point 
        return guiMålepunkt.NæsteMålepunkt(); 
       case Keys.Tab | Keys.Shift: 
       case Keys.Tab | Keys.Shift | Keys.Control: 
        // go to previous point 
        return guiMålepunkt.ForrigeMålepunkt(); 
      } 
      return false; 
     } 

Или обращаться с ними непосредственно в KeyUp, ловя их позже.

Если вы проверите их в KeyUp, посмотрите на KeyEventArgs, есть свойство Control and Shift (также Alt), которое вы можете проверить. Если KeyEventArg.Control затем установите его как обработанный.

Что касается кнопки «Конец» - я думаю, что есть клавиатура или что-то, что вы можете вызвать, чтобы спросить, нажата ли определенная клавиша.