2017-09-05 12 views
0

기존 IE 창에서 이벤트를 캡처하려고합니다. 아래의 코드 샘플에서는 사용자가 요소를 클릭 한 다음 클릭되는 요소에 대한 일부 특성을 다시 가져올 때 브라우저 문서에서 mouseClick 이벤트를 캡처하려고합니다.C#의 IE 이벤트 후킹

public partial class frmBrowserElementBuilder : Form 
{ 
    InternetExplorer ie; 
    public frmBrowserElementBuilder() 
    { 
     InitializeComponent(); 
    } 

    private void frmBrowserElementBuilder_Load(object sender, EventArgs e) 
    { 
     //create IE 
     ie = new InternetExplorer(); 
     ie.Visible = true; 

     //handle document completed 
     ie.DocumentComplete += new 
     DWebBrowserEvents2_DocumentCompleteEventHandler(DocumentComplete); 

    } 

    public void DocumentComplete(object pDisp, ref object URL) 
    { 
     //document was loaded 
     //MessageBox.Show("DocumentComplete: " + URL); 

     //create event handler and hook onclick from IE 
     DHTMLEventHandler onClickHandler = new DHTMLEventHandler(ie.Document); 
     onClickHandler.assignedEvent += new DHTMLEvent(this.ie_onClick); 
     ie.Document.onclick = onClickHandler; 
    } 

    private void ie_onClick(mshtml.IHTMLEventObj e) 
    { 
     //something was clicked 
     MessageBox.Show(string.Format("Event Hooked {0}, Qualifier {1}", e.type, e.qualifier)); 
    } 

    public delegate void DHTMLEvent(IHTMLEventObj e); 

    [ComVisible(true)] 
    public class DHTMLEventHandler 
    { 
     public DHTMLEvent assignedEvent; 

     private mshtml.HTMLDocument document; 
     public DHTMLEventHandler(mshtml.HTMLDocument doc) 
     { 
      //assign to instance of IE document 
      this.document = doc; 
     } 

     [DispId(0)] 
     public void Call() 
     { 
      //call the event 
      assignedEvent([email protected]); //{System.InvalidCastException: "Specified cast is not valid."} 
     } 

    } 

} 

코드는 컴파일하고 예상대로 무효 전화()는, 그러나, this.document.parentwindow의 값은 null입니다 트리거 및 System.InvalidCastException: Specified cast is not valid when stepping into the assignedEvent method.

를 throw되어 나는 this.document 검사 할 때, parentWindow 상태

의 값

함수를 평가하려면 모든 스레드가 실행되어야합니다.

평가 강제 후 상태 :

'((mshtml.HTMLDocumentClass) this.document) .parentWindow' 'System.InvalidCastException'형식의 예외가 발생했습니다.

아이디어가 있으십니까?

답변

1

이것은 threading 문제입니다. Call() 호출은 MTA 스레드에서 발생하며 MTA 스레드에서 MSHTML에 액세스 할 수 없습니다. 이를 변경하는 방법은 여러 가지가 있지만 가장 간단한 방법은 다음과 같습니다.

public void DocumentComplete(object pDisp, ref object URL) 
{ 
    var events = (HTMLDocumentEvents2_Event)ie.Document; 
    events.onclick += (evt) => 
    { 
     MessageBox.Show(string.Format("Event Hooked {0}, Qualifier {1}", evt.type, evt.qualifier)); 
     return false; 
    }; 
} 
+0

설명해 주셔서 감사합니다. –