ProcessCmdKey - ждать KeyUp? - PullRequest
       11

ProcessCmdKey - ждать KeyUp?

5 голосов
/ 12 марта 2010

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

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

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

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

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

Спасибо

Tom

Ответы [ 2 ]

9 голосов
/ 12 марта 2010

Я думал, что это будет легко, просто посмотри на счетчик повторений ключа. Не работает, хотя, если используются модификаторы. Вам также нужно будет увидеть, как повышается ключ, что требует реализации 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;
    }
}
3 голосов
/ 18 мая 2011
const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;

protected override bool ProcessKeyPreview(ref Message m)
{
    if (m.Msg == WM_KEYDOWN && (Keys)m.WParam == Keys.NumPad6)
    {
        //Do something
    }
    else if (m.Msg == WM_KEYUP && (Keys)m.WParam == Keys.NumPad6)
    {
        //Do something
    }

    return base.ProcessKeyPreview(ref m);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...