Как мне захватить Keys.F1 независимо от сфокусированного элемента управления на форме? - PullRequest
28 голосов
/ 10 мая 2011

Я использовал событие KeyDown и некоторый простой код, например if (e.KeyCode == Keys.F1), для захвата F1 нажимается в форме, НО, если в форме есть несколько текстовых полей или если в форме есть несколько таблиц с Dock Fill, то приведенный выше код получаетбесполезен и ничего не делает.Но я хочу что-то сделать, когда пользователь нажимает F1 в этой форме.так как мы собираем определенное событие keydown, такое как F1, во всей форме ... и я не хочу идти к маршруту, который захватывает KeyDown всех других элементов управления в форме, и передавать их в форму для обработки.Есть ли более чистый способ сделать это?

Ответы [ 4 ]

60 голосов
/ 10 мая 2011

Да, действительно, есть. Правильный способ для формы обрабатывать ключевые события независимо от элемента управления, который в данный момент имеет фокус ввода, - переопределить ProcessCmdKey метод вашего класса формы:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.F1)
    {
        MessageBox.Show("You pressed the F1 key");
        return true;    // indicate that you handled this keystroke
    }

    // Call the base class
    return base.ProcessCmdKey(ref msg, keyData);
}

Вы возвращаете true, чтобы указать, что вы обработали нажатие клавиши, и не не хочет, чтобы оно было передано другим элементам управления. Если вы do хотите, чтобы он был передан обработчикам событий для других элементов управления, просто верните false.

И лучше всего игнорировать свойство KeyPreview . Это анахронизм VB 6 дней и не самый предпочтительный способ сделать это в мире .NET. Дальнейшее чтение: Недостаток настройки Form.KeyPreview = true?

5 голосов
/ 10 мая 2011

Установите для формы KeyPreview значение true. Это обеспечит, чтобы форма сначала получала сообщения о нажатии клавиш, и если вы обрабатываете ее, вы можете установить e.Handled = true, чтобы она не передавалась элементам управления.

4 голосов
/ 10 мая 2011

Включите KeyPreview, и каждое нажатие клавиши в форме будет сначала направляться через обработчики событий клавиш.

3 голосов
/ 10 мая 2011

Другой способ - переопределить функцию ProcessCmdKey http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=VS.100).aspx

...