Я новичок в 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?
Есть ли другой способ переопределить цель?
Использование KeyUp, когда пользователь должен нажать 3 клавиши одновременно, не является хорошей идеей. Шансы, что он освобождает ключи в ожидаемом порядке, просто не очень хороши. Переопределение ProcessCmdKey() достаточно для обнаружения ярлыка, дополнительная обработка не требуется. –
Здравствуйте, спасибо за ваш ответ! Да, вы правы, я не должен допускать порядок выпущенных ключей, и я должен сохранить, что выпустил ключ для фильтрации. Мне нужно знать, есть ли метод, в который я могу поймать сообщение окна, которое запускает событие KeyUp, таким же образом, что и я в ProcessCmdKey() для предотвращения событий KeyDown. :) –
Мне совершенно непонятно, зачем это нужно. [Читать] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –