Сочетания клавиш приложения «проглатываются» дочерними компонентами - PullRequest
2 голосов
/ 06 августа 2010

В основной форме заявки у меня есть ряд функций кнопок меню и панели инструментов, которым я назначил сочетания клавиш, такие как F10 , F11 и F12, Ярлыки работают хорошо, за исключением случаев, когда некоторые элементы управления имеют фокус, например сторонний элемент управления сеткой. В этом случае F11 или другие ярлыки обрабатываются этим элементом управления и проглатываются ... они никогда не попадают в мой обработчик событий основного интерфейса.

Я на самом деле не хочу и не могу с помощью сторонних элементов управления изменять каждый элемент управления (есть десятки), чтобы передать мои F * ключи. Я думал о подключении к приложению, но это похоже на серьезное решение. Есть ли лучший, более умный способ справиться с этой ситуацией?

(Это приложение .NET WinForms MDI (2.0), в котором размещаются многие виды компонентов, предназначенных для домашнего вращения, а также сторонние компоненты.)

Ответы [ 3 ]

2 голосов
/ 06 августа 2010

Как насчет того, чтобы установить для свойства KeyPreview формы значение True? Вы должны быть в состоянии перехватить нужные вам ключи или позволить им пройти.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview.aspx

Если это не сработает, вы можете переопределить WndProc и обработать сообщения напрямую, но это потребует больше усилий.

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

Вот что я попробовал:

  • Переопределяет Sub WndProc
  • Переопределяет функцию ProcessKeyPreview
  • IMessageFilter.PreFilterMessage

Ничего из этого не сработало, хотя и должно было быть. Я подозреваю, что нарушающий контроль над детьми делает что-то подобное и не играет хорошо. Это старый Win32 OCX, и на самом деле он может делать что-то очень неприятное, например подключаться к сообщениям на уровне ОС. Точно сказать не могу.

В любом случае, Обходной путь должен был использовать Alt + SomeOtherKey. По любой причине использование Alt + D вместо F11 позволяет правильно обрабатывать сообщения и изменять фокус / вид.

Это решение является взломом стороннего элемента управления и подлинной проблемой черного ящика. Хотелось бы, чтобы я точно знал, что происходит, но я не знаю, хотя я подозреваю, что сторонний элемент управления имеет свои собственные крюки в насосе сообщений и перехватывает клавиши F *.

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

Пытались ли вы ловить нажатия клавиш на уровне формы MDI Child? Затем вы можете передать соответствующие нажатия клавиши F * родителю MDI в одном месте.

...