2012-06-10 44 views
3

我需要評估每個瀏覽器窗口中的文檔並採取相應的行動。我使用shellwindows來獲取IwebBrowser2。然後我可以訪問我需要的所有文檔屬性。即...如何使用Delphi接收來自IE的事件?

ShellWindows:= TshellWindows.Create(nil);

...

ShellWindowDisp:= ShellWindows.Item(計數); // for循環

...

ShellWindowDisp.QueryInterface(IWebBrowser2的,web瀏覽器);

etc ....

此方法工作正常,據我所知。但是,如果其中一個文檔發生更改,我的代碼將永遠不會知道它。所以我需要監視瀏覽器的事件,如OnDocumentComplete。將上面的代碼轉儲到計時器中並比較屬性顯然不是要走的路。我發現了幾個捕捉事件的組件,但不會依賴於第三方組件。由於我在這方面的知識有限,我需要了解發生了什麼。那裏有任何好的文章解釋如何解決這個問題,最好用簡單的源代碼?

回答

4

爲了訪問web瀏覽器實例的事件,必須獲得一個指向使用IWebBrowser2接口的QueryInterface方法的IConnectionPointContainer接口,然後調用FindConnectionPoint方法傳遞DWebBrowserEvents2接口的GUID最後調用Advise方法IConnectionPoint界面開始接收事件。

的東西,像這樣

var 
LConnectionPointContainer : IConnectionPointContainer; 
LConnectionPoint : IConnectionPoint; 
dwCookie: Longint; 
begin 
    //LWebBrowser2 is a IWebBrowser2 object 
    LWebBrowser2.QueryInterface(IConnectionPointContainer, LConnectionPointContainer); 
    LConnectionPointContainer.FindConnectionPoint(DWebBrowserEvents2, LConnectionPoint); 
    LConnectionPoint.Advise(Self, dwCookie); 
end; 

所有這些代碼必須從IDispatch的下降,以獲得在Invoke方法的事件類的內部實現。至於你的情況,你需要攔截DocumentComplete事件中,你必須檢查時的值DISPID參數是259

如果你想的這個解釋的樣本,請檢查該代碼intercept Internet Explorer messages.

+0

感謝RRUZ!自從我處理客戶端/服務器自動化事件以來已經有一段時間了。我的基本理解是客戶端詢問服務器,但不是相反。反過來使用服務器事件模型是光滑的,我不知道。謝謝! – user1446583

相關問題