Прикрепите обработчик событий к mshtml.disphtmlinputelement
-
18-09-2019 - |
Вопрос
Я занят написанием BHO (Browser Hertper Object) в C#, и мне нужно прикрепить обработчики событий ко всем событиям OnClick на входных элементах. Я не использую встроенный WebBrowrowser, предоставленный Visual Studio, вместо этого я запускаю новый экземпляр Internet Explorer, установленного на ПК клиентов. Проблема возникает при использовании разных версий IE.
В 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. Любые идеи?
Решение
Таким образом, выясняется, что, как только вы выпустите из объекта 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 и Text Fields, поэтому мне пришлось сначала поднять на DisphtmlinPutelement