У меня есть следующая проблема в приложении WinForms. Я пытаюсь реализовать Горячие клавиши, и я должен обработать Ключевые сообщения каждый раз, когда управление активно, неважно, если фокус находится на текстовом поле в рамках того управления и т.д.
Переопределение ProcessCmdKey работает красиво на это и делает точно, что я хочу за одним исключением:
Если пользователь нажимает клавишу и удерживает ее в нажатом состоянии, ProcessCmdKey продолжает инициировать события WM_KEYDOWN.
Однако то, чего я хочу достигнуть, - то, что пользователь должен отпустить кнопку снова, прежде чем другое действие горячей клавиши инициировало бы (так, если бы кто-то сидит на клавиатуре, это не вызвало бы непрерывные события горячей клавиши).
Однако я не могу найти, где поймать события WM_KEYUP, таким образом, я могу установить флаг, если он должен обработать сообщения ProcessCmdKey снова?
Кто-либо может помочь здесь?
Спасибо,
Tom
Я думал, это будет легко, просто посмотрите на количество повторов ключа. Но не сработало, если использовались модификаторы. Вам также нужно будет увидеть, как поднялся ключ, что требует реализации IMessageFilter. Это сработало:
public partial class Form1 : Form, IMessageFilter {
public Form1() {
InitializeComponent();
Application.AddMessageFilter(this);
this.FormClosed += (s, e) => Application.RemoveMessageFilter(this);
}
bool mRepeating;
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Control | Keys.F) && !mRepeating) {
mRepeating = true;
Console.WriteLine("What the Ctrl+F?");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
public bool PreFilterMessage(ref Message m) {
if (m.Msg == 0x101) mRepeating = false;
return false;
}
}