4

我正忙着用 C# 编写 BHO(浏览器帮助对象),我需要将事件处理程序附加到输入元素上的所有 onclick 事件。我没有使用 Visual Studio 提供的内置网络浏览器,而是启动安装在客户端 PC 上的 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 对象的方法。有任何想法吗?

4

1 回答 1

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);
      }
    }
  }
 }

但是,您可以直接连接到事件处理程序,但我想排除一些类型,如密码和文本字段,因此我必须先转换为 DispHTMLInputElement

于 2009-12-11T09:06:41.657 回答