2011-08-28 63 views
2

我正在編寫一個項目,我正在編寫一個c#windows應用程序想要從正在運行的Internet Explorer實例獲取光標下的當前元素。將onmouseover事件分配給我的htmldocument不起作用

我可以得到IE的運行實例的IHTMLDocument2的把手,我想給它分配這樣的onmouseover事件:

DHTMLEventHandler myHandler = new DHTMLEventHandler(htmlDocument); 
myHandler.Handler += new DHTMLEvent(this.BrowserEventHandler); 
htmlDocument.onmouseover = myHandler; 

而且因爲我不想讓IE吃其他事件(著名,但解決問題),我應該創建一個DHTMLEventHandler類是這樣的:

public delegate void DHTMLEvent(IHTMLEventObj obj); 

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

    private IHTMLDocument2 Document; 

    public DHTMLEventHandler(IHTMLDocument2 doc) 
    { 
     Document = doc; 
    } 

    [DispId(0)] 
    public void Call() 
    { 
     Handler([email protected]); 
    } 
} 

而且我BrowserEventHandler的方法是這樣的:

public void BrowserEventHandler(IHTMLEventObj e) 
    { 
    } 

仍然是空的(但我想要得到的元素innerHtml下光標),但仍這種方法是空的,我也得到:

「」類型的第一次機會異常出現在FindText.exe

每當我移動鼠標。

問題:

  1. 爲什麼我得到這個例外?
  2. 是否有可能在變量中使用e.srcElement.innerhtml並在我的c#應用程序中使用?

讓我知道是否有什麼不清楚和含糊不清。提前感謝任何幫助和想法。我大大感謝任何意見和幫助。

更新:

回答我的第二個問題,似乎有可能得到IHTMLEventObj ee.srcElement.innerHTML但我真的不知道爲什麼BrowserEventHandler方法不會被調用。任何想法或提示?

UPDATE2:

好吧,我發現這個問題。首先,我改變了我的項目的一些設置,以獲得異常第一次發生的線(因爲這是第一次機會例外),如下所示:

在visual studio中:Menu >> Debug >> Exceptions >> CLR exceptions >> system並檢查SystemInvalidCastException的throw選項。

我發現這個問題是這一行DHTMLEventHandler類:

Handler([email protected]); 

它拋出Invalid Cast Exception我認爲這是根據我最近的搜索與Thread秒。

我想我應該把ApartmentState設置爲ApartmentState.STA。但我不知道如何。有任何想法嗎?

回答

1

好吧,我找到了解決辦法! :)

我需要改變DHTMLEventHandler類是這樣的:

public delegate void DHTMLEvent(IHTMLEventObj obj); 

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDispatch)] 
public class DHTMLEventHandler 
{ 
    private Thread currentThread; 
    public DHTMLEvent Handler; 

    private IHTMLDocument2 Document; 

    public DHTMLEventHandler(IHTMLDocument2 doc) 
    { 
     Document = doc; 
    } 

    [DispId(0)] 
    [STAThread] 
    public void Call() 
    { 
     currentThread = Thread.CurrentThread; 
     Thread parentWin = new Thread(new ThreadStart(pWindowHandler)); 
     parentWin.SetApartmentState(ApartmentState.STA); 
     parentWin.Start(); 
     currentThread.Suspend(); 
     // Handler([email protected]); 

    } 
    public void pWindowHandler() 
    { 
     Handler([email protected]); 
     currentThread.Resume(); 
    } 
} 

但是,如果任何人試圖用我的解決方案,我不知道它是否有在其他情況下,任何副作用。至少它對我來說工作得很好! :)

+0

謝謝盧克張貼答案。我試圖讓這個在VB.NET中工作,並有各種問題。 Call中使用的線程是一個對VB.NET無用的MTA線程。我驚訝它在C#中的作品。但是,在設置自動化IE的同時,如果由於我的代碼導致事件觸發,其他地方都會鎖定。我也嘗試了你的代碼,並停止了調用線程,但是這是IE的線程,所以什麼都不能做。 – darbid

0
+0

感謝您張貼鏈接(它有一些我以前從未關心的好點)。但對於我的問題,我在'call'方法中創建了一個新線程,然後將ApartmentState設置爲'ApartmentState.STA'。當我這樣做時,異常消失了,但是對於'BrowserEventHandler'中的'IHTMLEventObj e',我得到空值(e爲空)。我想我在線程中犯了一個錯誤,有什麼想法? (再次感謝鏈接):) – Luke