Нам нужно обработать это событие в базовой форме, независимо от того, какие элементы управления в настоящее время имеют фокус. У нас есть пара глобальных ключевых команд, которые должны работать независимо от фокуса управления.
Это работает путем обычной обработки события PreviewKeyDown в форме. Когда мы добавляем в форму пользовательский элемент управления, событие больше не запускается.
Я упустил здесь что-то тривиальное? Или нам нужно сначала обработать событие в пользовательском элементе управления?
Спасибо за вашу помощь!
Спасибо, фактор. Когда у меня будет больше времени :) Я заставлю его работать «правильно»!





Вероятно, это не лучший способ сделать это, но это первый способ, который приходит на ум.
В конструкторе форм после вызова InitializeComponent (); сделай что-нибудь вроде этого:
foreach (Control control in this.Controls)
{
control.PreviewKeyDown += new PreviewKeyDownEventHandler(HandlePreviewKeyDown);
}
Я ДУМАЮ, это должно помочь. Затем в своем методе HandlePreviewKeyDown вы можете выполнять свою работу, и он должен срабатывать независимо от того, какой элемент управления имеет фокус.
PreviewKeyDown работает только тогда, когда элемент управления находится в фокусе. Похоже, вам следует изучить уровень приложения крюк для специальных сочетаний клавиш. Вам нужно будет сделать это с помощью P / Invoke. SetWindowsHookEx на pinvoke.net - хорошее место для примера. Вот Статья MS KB о ловушке мыши в C#, который, кажется, расширен до клавиатурного крючка в этой статье.
Скрытое меню, которое вы используете, отлично работает с ярлыками, которые являются действительными ярлыками пунктов меню, но если вы хотите использовать любую клавишу в качестве ярлыка (например, Page Up / Page Down), вам понадобится другой трюк.
Другой способ сделать это, не использующий P / Invoke, - установить для свойства Form.KeyPreview вашей формы значение true. Это приведет к тому, что все нажатия клавиш будут сначала отправлены в форму, независимо от того, какой элемент управления имеет фокус. Затем вы можете переопределить OnKeyDown, OnKeyPress и / или OnKeyUp, чтобы обрабатывать нажатие клавиши перед любым из ваших элементов управления.
В итоге мы сделали это:
Я нашел обходной путь, настроив скрытый пункт меню, установив:
ToolStripMenuItem.Visible = false
(Спасибо эта статья).
Похоже, что в главном меню формы всегда выполняется поиск комбинации клавиш быстрого доступа. Это работает независимо от того, какой элемент управления имеет фокус.
Я закончил тем, что спрятал свой курсор, потому что мое приложение - это 100% клавиатура и ноль мыши