Как определить ввод/удержание управления на основе каждого приложения без доступа к форме управления?


1

Я могу использовать события Control.Enter и Control.Leave, чтобы определить, когда пользовательский фокус входит или выходит из управления, но это работает только на основе каждой формы. Я использую несколько форм в своем приложении и хочу отслеживать, какой элемент управления имеет пользовательский фокус, я должен использовать формы «Активированные и деактивированные события» для отслеживания активной формы, а затем отслеживать, какой элемент управления сосредоточен в каждой форме.

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

0

Возможно, зайдите в Блок блокировки единства и инверсию контроля (IOC) Инъекции зависимостей контейнера?

http://codebetter.com/blogs/david.hayden/archive/2008/02/22/unity-ioc-screencast.aspx


1

Не могли бы вы крюк в Control.GotFocus/Control.LostFocus вместо, а затем сохранить глобальный след которые контролируют в настоящее время имеет фокус?

Добавление этих крючков событий в каждый элемент управления будет довольно утомительным и подверженным ошибкам, поскольку вы можете упустить контроль интересов. Так что, как об использовании вызова Application.AddMessageFilter, чтобы получить обратный вызов для каждого окна сообщения, которое встречается в приложении.

Затем вы можете просмотреть все сообщения WM___SETFOCUS и WM_KILLFOCUS и сохранить примечание текущего элемента управления с фокусом. Не забудьте использовать удобный статический метод Control.FromHandle, чтобы получить хорошую ссылку управления .NET из дескриптора окна, который вы кешируете при отслеживании двух сообщений Windows.

  0

К сожалению, сообщение WM_SETFOCUS не всегда проходит очередь сообщений, поэтому я не могу его перехватить. См. Http://www.pcreview.co.uk/forums/thread-1314811.php 23 фев. 092009-02-23 10:32:18