Один обработчик событий для всех элементов управления в форме - PullRequest
5 голосов
/ 14 сентября 2011

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

foreach (System.Windows.Forms.Control cont in this.Controls)
                cont.KeyDown += new System.Windows.Forms.KeyEventHandler(this.MainForm_KeyPress);

в функции InitializeComponent () непосредственно перед автоматически генерируемыми вызовами ResumeLayout / PerformLayout. Не обращайте внимания на имя MainForm_KeyPress, теперь это фактически обработчик событий KeyDown.

Я также пытался вставить код в мою функцию init (), которая вызывается из конструктора. Но результат был тот же: событие не происходит при нажатии клавиш. Фокус на одной из кнопок формы.

Но если я реализую обработчик для одной из кнопок с помощью инструмента конструктора (скопировать имя функции в поле события KeyPress), событие возникает правильно, если кнопка в фокусе.

Есть идеи, почему foreach не работает?

Ответы [ 2 ]

6 голосов
/ 14 сентября 2011

MSDN говорит, что вы можете сделать с установкой KeyPreview в true.

1 голос
/ 14 сентября 2011

Может быть, вам нужно найти и зарегистрировать его для дочерних элементов управления каждого элемента управления, с которым вы сталкиваетесь, вниз по дереву?

Первое, что я хотел бы сделать, если у меня возникнет эта проблема, - {} обойти регистрацию ивывод "сейчас регистрируется" + имя элемента управления.Таким образом, вы можете смотреть и видеть, сколько элементов управления зарегистрировано и каковы они.Может быть, это просто основная панель, а субконтроли обрабатывают клавишу вниз?У меня также были проблемы с обработчиками событий нажатия клавиш при работе в dockmanager, dockmanager обрабатывал клавиатуру на другом уровне и направлял событие на определенный дочерний элемент управления, который, как он думал, должен его получить.

Если выдо сих пор не понимаю, следующая вещь, которую я бы сделал, это подключить события формы, или, может быть, даже отслеживать события сообщения WM_ windows.В какой-то момент WM_ преобразуется в событие .NET с помощью кода, и это может быть реализовано непредвиденными способами и взломано сторонними элементами управления и т. Д. Операционная система должна направлять события WM_ в ваш процесс.так что следите за ними с помощью обработчиков сквозных событий, которые регистрируют, что происходит.

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

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