문제

C#에 BHO (브라우저 헬퍼 객체)를 작성 하느라 바쁘고 입력 요소의 모든 on 클릭 이벤트에 이벤트 핸들러를 첨부해야합니다. Visual Studio에서 제공하는 내장 된 웹 브라우저를 사용하지 않고 Clients 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 객체에 첨부하는 방법을 찾을 수 없다는 것입니다. 어떤 아이디어?

도움이 되었습니까?

해결책

따라서 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로 캐스트해야했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top