Всегда обрабатывать событие PreviewKeyDown в базовой форме - PullRequest
2 голосов
/ 06 ноября 2008

Нам нужно обработать это событие в базовой форме, независимо от того, какие элементы управления в данный момент имеют фокус. У нас есть пара команд глобального ключа, которые должны работать независимо от фокуса управления.

Это работает при обычной обработке события PreviewKeyDown в форме. Когда мы добавляем пользовательский элемент управления в форму, событие больше не запускается.

Я что-то упустил здесь? Или нам нужно сначала обработать событие в пользовательском элементе управления?

Спасибо за вашу помощь!

Спасибо фактор. Когда у меня будет больше времени :) Я получу это, как надо!

Ответы [ 4 ]

2 голосов
/ 10 ноября 2008

Скрытое меню, которое вы используете, прекрасно работает для ярлыков, которые являются допустимыми ярлыками пунктов меню, но если вы хотите использовать любую клавишу в качестве ярлыка (например, Page Up / Page Down), вам понадобится другой трюк.

Еще один способ сделать это без участия P / Invoke - установить для свойства Form.KeyPreview вашей формы значение true. Это приведет к тому, что все нажатия клавиш будут сначала отправляться в форму, независимо от того, какой элемент управления имеет фокус. Затем вы можете переопределить OnKeyDown, OnKeyPress и / или OnKeyUp для обработки нажатия клавиши перед любым из ваших элементов управления.

1 голос
/ 04 мая 2010

В итоге мы сделали это:

Я нашел обходной путь для этого, настроив скрытый пункт меню, установив:

ToolStripMenuItem.Visible = false

(Благодаря этой статье) .

Похоже, что в главном меню формы всегда выполняется поиск комбинации клавиш. Это работает независимо от того, какой элемент управления имеет фокус

1 голос
/ 06 ноября 2008

PreviewKeyDown работает только тогда, когда элемент управления имеет фокус. Похоже, вы должны искать на уровне приложения hook для специальных сочетаний клавиш. Вам придется сделать это с помощью P / Invoke. SetWindowsHookEx на pinvoke.net - хорошее место для примера. Вот статья MS KB о хуке мыши в c # , которая в этой статье, похоже, расширена до хука клавиатуры .

0 голосов
/ 06 ноября 2008

Вероятно, это не лучший способ сделать это, но первый способ, который приходит на ум.

В конструкторе форм после вызова InitializeComponent (); сделать что-то вроде этого:

            foreach (Control control in this.Controls)
            {
                control.PreviewKeyDown += new PreviewKeyDownEventHandler(HandlePreviewKeyDown);
            }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...