2009-03-15 5 views
0

Предположим, у меня есть интернет-браузер, встроенный в форму окна, и затем я перехожу к случайной странице в Интернете. Как определить, когда текстовое поле (или любой другой элемент управления, который может принимать текстовый ввод, если на то пошло) становится объектом в фокусе? В принципе, каждый раз, когда нажимается мышь, я могу проверить, является ли элемент в фокусе текстовым полем или каким-либо другим элементом управления для ввода текста, а затем действовать соответствующим образом.Как определить, имеет ли текстовое поле в форме окна фокус

Спасибо заранее,

Боб

+0

Что связь с WebBrowser? Вы хотите найти элементы HTML или элементы управления WinForm? –

+0

Элементы управления WinForm. – Beaker

+0

, а как насчет того, как вы проверяете ответ (и ставите старый вопрос назад), а затем открываете новый вопрос, поэтому другие ответы будут иметь смысл, если они не будут обновлены. – TStamper

ответ

1

Вы до сих пор не объяснили крен WebBrowser, но проблема, как представляется, отслеживание фокуса ввода. Я не знаю события уровня формы, но вы можете подключить обработчик событий к событию Enter или GotFocus всех соответствующих элементов управления.

// in Form_Load 
foreach (var control in this.Controls) control.Enter += OnEnterControl; 


private void OnEnterControl(object sender, EventArgs e) 
{ 
    focusControl = (sender as Control); 
} 
+0

Я получаю дескриптор элемента управления браузером ActiveX IE, который встроен в форму Windows, а затем с помощью этого дескриптора для отправки ввода в элемент управления браузера, например, для того, чтобы программно щелкнуть по определенному месту. Ваше решение может работать для меня. Я попробую, а затем проверить его как ответ, если он – Beaker

+0

Это будет работать только для элементов управления winform. Это не будет работать для элементов управления MSHTML внутри веб-браузера, и я думаю, это то, о чем просит ОП. –

+0

@jeffamaphone: см. Комментарии под OP. –

0

Я считаю, что вы хотите сделать, это утопить HTMLTextContainerEvents2 диспинтерфейс и реагировать на OnFocus (и потенциально ONBLUR).

Вы правы, что вам нужно будет сделать interop через pinvoke самостоятельно. Я предполагаю, что вы можете получить указатели IHTMLElement ко всем объектам, которые вы хотите отслеживать (используя getElementsByTagName или некоторые такие вещи). Как только у вас есть это,

  1. Запросить IHTMLElemnt для IConnectionPointContainer.
  2. Вызов IConnectionPointContainer :: FindConnectionPoint (DIID_DHTMLTextContainerEvents2)
  3. Вызов IConnectionPoint :: Консультировать() на IConnectionPoint, полученного на стадии 2.
  4. И, конечно, необходимо реализовать IDispatch :: Invoke(), который будет ваш обратный вызов ,
  5. ручки DISPID_HTMLELEMENTEVENTS2_ONFOCUS и т.д.
+0

И не забудьте отключиться, когда закончите. –

+0

До сих пор я использовал SendInput и SendMessage для достижения большой функциональности. Я бы предпочел ответ, который предполагает использование дескриптора элемента управления IE. Я просто ищу работу с элементами управления Windows в элементе управления IE, поэтому я не думаю, что для этого потребуются специальные объекты IE. – Beaker

+0

Ну, это не элементы управления Windows в элементе управления IE. MSHTML отображает все свои собственные элементы управления (кроме combobox на IE6). Поэтому вы не можете просто обращаться с этими элементами управления, потому что у них нет ручек. Вы можете использовать spy ++ для проверки. –