ProcessCmdKey - ожидать KeyUp?

У меня есть следующая проблема в приложении WinForms. Я пытаюсь реализовать Горячие клавиши, и я должен обработать Ключевые сообщения каждый раз, когда управление активно, неважно, если фокус находится на текстовом поле в рамках того управления и т.д.

Переопределение ProcessCmdKey работает красиво на это и делает точно, что я хочу за одним исключением:

Если пользователь нажимает клавишу и удерживает ее в нажатом состоянии, ProcessCmdKey продолжает инициировать события WM_KEYDOWN.

Однако то, чего я хочу достигнуть, - то, что пользователь должен отпустить кнопку снова, прежде чем другое действие горячей клавиши инициировало бы (так, если бы кто-то сидит на клавиатуре, это не вызвало бы непрерывные события горячей клавиши).
Однако я не могу найти, где поймать события WM_KEYUP, таким образом, я могу установить флаг, если он должен обработать сообщения ProcessCmdKey снова?

Кто-либо может помочь здесь?

Спасибо,

Tom

5
задан TJF 12 March 2010 в 18:15
поделиться

1 ответ

Я думал, это будет легко, просто посмотрите на количество повторов ключа. Но не сработало, если использовались модификаторы. Вам также нужно будет увидеть, как поднялся ключ, что требует реализации 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;
    }
}
9
ответ дан 13 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: