Как определить, какой элемент управления съедает мои события клавиатуры

В моем приложении .Net я все время сталкиваюсь с проблемой конкретной формы / элемента управления, которая, как я ожидал, получит событие клавиатуры, на самом деле его не получает. Моя отладка этого не продвинулась далеко за пределы пещерного человека, например, установка точек останова во всех моих элементах управления и просмотр того, кто съел событие клавиатуры, которого не должно быть. Должен быть способ получше - есть ли инструмент, который поможет мне отследить обработку событий клавиатуры?


person Not Sure    schedule 17.06.2009    source источник
comment
KeyPress, KeyDown, PreviewKeyDown   -  person Not Sure    schedule 18.06.2009
comment
Ключ Escape - это сегодняшняя проблема   -  person Not Sure    schedule 18.06.2009
comment
У вас есть кнопка CancelButton в вашей форме? Это съест ключ к побегу.   -  person Jon B    schedule 18.06.2009
comment
Пробовал как с CancelButton, так и без него. На данный момент я просто подключил его к основному элементу управления в рассматриваемой форме, но мне все равно хотелось бы знать, почему форма не получает Escape даже с PreviewKey.   -  person Not Sure    schedule 18.06.2009
comment
Я не отвечаю на ваш вопрос напрямую, поэтому публикую его как комментарий; в моем случае это была функциональная клавиша, которая не работала, и в итоге оказалось, что это была глупая клавиша f-lock на моей клавиатуре Logitech, которую, должно быть, нажала уборщица.   -  person Jeff Axelrod    schedule 07.06.2011


Ответы (3)


Первое, что я сделал бы, это проверил бы в окне «Свойства» (или в файле конструктора), чтобы убедиться, что обработчик событий действительно подключен к событию.

person Fredrik Mörk    schedule 17.06.2009
comment
Спасибо, но я не новичок =) - person Not Sure; 18.06.2009
comment
Рад слышать; Вы сказали пещерный человек, поэтому я подумал, что мы начнем с основ; o) - person Fredrik Mörk; 18.06.2009

Предполагая, что вы используете полную версию Visual Studio (а не версию Express или что-то еще), используйте Spy ++. Когда вы запускаете Spy ++, найдите корневое окно вашего приложения (Spy ++ имеет удобный пункт меню Поиск> Найти окно, чтобы помочь), затем щелкните правой кнопкой мыши корневое окно в дереве Windows и выберите Сообщения. Это должно привести вас к панели сообщений, которая начнет отслеживать все сообщения для этого окна. Начните вводить и проверьте WM_KEYDOWN и т. Д. Если вы по-прежнему не видите нажатия клавиш, перейдите к параметрам обмена сообщениями и отметьте «Окна того же процесса». На этом этапе вы должны иметь возможность отслеживать все события нажатия клавиш в процессе. Щелкните правой кнопкой мыши сообщение WM_KEYDOWN (или подобное) и перейдите к свойствам. В свойствах должен отображаться дескриптор окна, обрабатывающего сообщение, и щелчок по нему выделит его в дереве Windows. Теперь все, что вам нужно сделать, это щелкнуть правой кнопкой мыши выделенное окно и выбрать «Выделить», чтобы увидеть, какой элемент управления находится в вашей форме.

person Corillian    schedule 24.08.2010
comment
Другие редакции поддерживают Spy ++. См.: stackoverflow.com/questions/43360339/ - person Jazimov; 29.03.2021

Обычно форма обрабатывает события нажатия клавиш. Нет инструмента, потому что он просто отслеживает трассировку стека. Лучшей идеей было бы сделать оператор трассировки (добавить точку останова и щелкнуть правой кнопкой мыши, перейти к При попадании) в событии KeyPress вашей формы, а затем просмотреть информацию в объектах form.KeyEventArgs и отправителя.

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

e.Handled = true;

or

e.SuppressKeyPress = true;

Я также не рекомендую использовать окно конструктора / свойств для подключения ваших событий, используйте Addhandler (VB) или + = (C #), потому что в более сложных формах у вас будут сценарии многих элементов управления, совместно использующих обработчики событий и динамически определяющих обработчики в время выполнения.

person marr75    schedule 17.06.2009
comment
Вы можете легко получить общие обработчики событий, даже если вы используете окно «Свойства» для присоединения обработчиков событий. - person Fredrik Mörk; 18.06.2009