Всегда обрабатывайте событие PreviewKeyDown в базовой форме

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
7 105
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

В конструкторе форм после вызова 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% клавиатура и ноль мыши

Moon 18.05.2012 09:12

Другие вопросы по теме