В моем приложении .Net я все время сталкиваюсь с проблемой конкретной формы / элемента управления, которая, как я ожидал, получит событие клавиатуры, на самом деле его не получает. Моя отладка этого не продвинулась далеко за пределы пещерного человека, например, установка точек останова во всех моих элементах управления и просмотр того, кто съел событие клавиатуры, которого не должно быть. Должен быть способ получше - есть ли инструмент, который поможет мне отследить обработку событий клавиатуры?
Как определить, какой элемент управления съедает мои события клавиатуры
Ответы (3)
Первое, что я сделал бы, это проверил бы в окне «Свойства» (или в файле конструктора), чтобы убедиться, что обработчик событий действительно подключен к событию.
Предполагая, что вы используете полную версию Visual Studio (а не версию Express или что-то еще), используйте Spy ++. Когда вы запускаете Spy ++, найдите корневое окно вашего приложения (Spy ++ имеет удобный пункт меню Поиск> Найти окно, чтобы помочь), затем щелкните правой кнопкой мыши корневое окно в дереве Windows и выберите Сообщения. Это должно привести вас к панели сообщений, которая начнет отслеживать все сообщения для этого окна. Начните вводить и проверьте WM_KEYDOWN и т. Д. Если вы по-прежнему не видите нажатия клавиш, перейдите к параметрам обмена сообщениями и отметьте «Окна того же процесса». На этом этапе вы должны иметь возможность отслеживать все события нажатия клавиш в процессе. Щелкните правой кнопкой мыши сообщение WM_KEYDOWN (или подобное) и перейдите к свойствам. В свойствах должен отображаться дескриптор окна, обрабатывающего сообщение, и щелчок по нему выделит его в дереве Windows. Теперь все, что вам нужно сделать, это щелкнуть правой кнопкой мыши выделенное окно и выбрать «Выделить», чтобы увидеть, какой элемент управления находится в вашей форме.
Обычно форма обрабатывает события нажатия клавиш. Нет инструмента, потому что он просто отслеживает трассировку стека. Лучшей идеей было бы сделать оператор трассировки (добавить точку останова и щелкнуть правой кнопкой мыши, перейти к При попадании) в событии KeyPress вашей формы, а затем просмотреть информацию в объектах form.KeyEventArgs и отправителя.
Другие важные моменты, на которые следует обратить внимание: несимвольные клавиши (в том числе страница вниз, страница вверх и т. Д.) Не вызывают событие нажатия клавиши, они только вызывают нажатие клавиши и нажатие клавиши, события нажатия клавиш поглощаются формой, если вы установили
e.Handled = true;
or
e.SuppressKeyPress = true;
Я также не рекомендую использовать окно конструктора / свойств для подключения ваших событий, используйте Addhandler (VB) или + = (C #), потому что в более сложных формах у вас будут сценарии многих элементов управления, совместно использующих обработчики событий и динамически определяющих обработчики в время выполнения.