2009-12-10 4 views
3

Я занят написанием BHO (вспомогательного объекта браузера) в C#, и мне нужно привязать обработчики событий ко всем событиям onclick на элементах ввода. Я НЕ использую встроенный веб-браузер, предоставляемый visual studio, вместо этого я запускаю новый экземпляр Internet Explorer, установленный на клиентском ПК. Проблема возникает при использовании разных версий IE.Присоединить обработчик события к mshtml.DispHTMLInputElement

В IE7 и IE8 я могу сделать это так:

public void attachEventHandler(HTMLDocument doc) 
{ 
    IHTMLElementCollection els = doc.all; 
    foreach (IHTMLElement el in els) 
    { 
    if(el.tagName == "INPUT") 
    { 
     HTMLInputElementClass inputElement = el as HTMLInputElementClass; 
     if (inputElement.IHTMLInputElement_type != "text" && InputElement.IHTMLInputElement_type != "password") 
     { 
     inputElement.HTMLButtonElementEvents_Event_onclick += new HTMLButtonElementEvents_onclickEventHandler(buttonElement_HTMLButtonElementEvents_Event_onclick); 
     } 
    } 
    } 
} 

Это прекрасно работает, дело в том, IE6 выдает ошибку при забросе на HTMLInputElementClass, так что вы вынуждены бросить в DispHTMLInputElement:

public void attachEventHandler(HTMLDocument doc) 
{ 
    IHTMLElementCollection els = doc.all; 
    foreach (IHTMLElement el in els) 
    { 
    if(el.tagName == "INPUT") 
    { 
     DispHTMLInputElement inputElement = el as DispHTMLInputElement; 
     if (inputElement.type != "text" && inputElement.type != "password") 
     { 
     //attach onclick event handler here 
     } 
    } 
    } 
} 

Проблема в том, что я не могу найти способ привязать событие к объекту DispHTMLInputElement. Есть идеи?

ответ

5

Таким образом, выясняется, что после того, как вы отбросили из объекта System_ComObject объект DispHTMLInputElement, вы можете взаимодействовать с интерфейсом mshtml. [Events]. Таким образом, код, чтобы добавить обработчик событий для IE6 будет:

public void attachEventHandler(HTMLDocument doc) 
{ 
    IHTMLElementCollection els = doc.all; 
    foreach (IHTMLElement el in els) 
    { 
    if(el.tagName == "INPUT") 
    { 
     DispHTMLInputElement inputElement = el as DispHTMLInputElement; 
     if (inputElement.type != "text" && inputElement.type != "password") 
     { 
     HTMLButtonElementEvents_Event htmlButtonEvent = inputElement as HTMLButtonElementEvents_Event; 
     htmlButtonEvent.onclick += new HTMLButtonElementEvents_onclickEventHandler(buttonElement_HTMLButtonElementEvents_Event_onclick); 
     } 
    } 
    } 
} 

Однако вы можете взаимодействовать непосредственно в обработчик события, но я хотел, чтобы исключить некоторые виды, такие как passwaord и текстовые поля, поэтому я должен был бросить в DispHTMLInputElement сначала