Общие элементы управления, прерывающие уведомления WM_KEYDOWN - PullRequest
1 голос
/ 29 июля 2010

У меня есть окно, которое создает множество других общих элементов управления, таких как меню, панели инструментов с кнопками и полями со списком, а также строка состояния. Проблема в том, что окно никогда не получает сообщение WM_KEYDOWN всякий раз, когда я нажимаю Enter или Esc, но мне нужно обработать их. Есть ли какой-нибудь общий элемент управления, который, как известно, прерывает эти ключи?

Ответы [ 4 ]

0 голосов
/ 03 августа 2010

Я пишу плагин для Outlook прямо сейчас. У меня есть элемент управления WinForms, размещенный внутри, и он никогда не получает клавишу возврата, поскольку похоже, что WM_KEY *** фактически превращен в WM_COMMAND для реализации ускорителей клавиатуры, как, вероятно, в вашем случае. Вы пробовали SPY ++?

0 голосов
/ 29 июля 2010

Windows всегда отправляет сообщения WM_KEY *** окну, которое имеет фокус.Таким образом, все элементы управления, которые получают фокус, «прерывают» сообщения клавиатуры.

Общий способ справиться с этим подразумевается при работе функции IsDialogMessage .

Сообщения клавиатурыразмещены в очереди сообщений приложений.Ожидается, что сообщения клавиатуры, которые применяются к приложению в целом, обрабатываются в цикле сообщений приложения.Эти нажатия клавиш обычно называются «ускорителями», и для их устранения существует API: TranslateAccelerator

Создайте таблицу ускорителей, описывающую нажатия клавиш, измените цикл сообщений, чтобы сначала передать все сообщения TranslateAcceleratorи тебе надо идти.

0 голосов
/ 03 августа 2010

Если вы не получаете нажатия клавиш Enter и Esc, то, скорее всего, вы используете механизм перевода диалогов: Enter - закрыть диалоговое окно с помощью OK, Esc - закрыть его с помощью Cancel.

Если вам нужны эти два ключа, вы должны перехватить сообщение WM_GETDLGCODE и обработать флаг DLGC_WANTMESSAGE. Подробнее см. kb83302 .

0 голосов
/ 29 июля 2010

Вы можете попробовать несколько вещей.1) Если окно уже открыто, попробуйте Window1.Focus ();(MSDN сообщает, что для фокусировки форма должна быть видимой, включенной и иметь обработчик) 2) Если она не открыта, попробуйте Window1.Activate ();

Кроме того, WM_KEYDOWN может раздражать,Вы можете попробовать использовать SendKeys.Send () или SendKeys.SendWait () для отправки нажатий клавиш.

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