2014-02-14 58 views

回答

3

找到了一個解決辦法:

我不得不執行附加DWebBrowserEvents2 interfacethis Code Project article描述來獲得額外的事件。

然後,我在BeforeNavigate2 event收到通知,提供更多信息。

我發現pDispIWebBrowser2 interface和該接口的Parent propertyNULL是用於頂部窗口和非NULL爲(I)幀。

這足以給我,讓我可以那麼寫:

public class BrowserExtendedNavigatingEventArgs : CancelEventArgs 
{ 
    // ... 

    public bool IsInsideFrame 
    { 
     get 
     { 
      var wb = AutomationObject as UnsafeNativeMethods.IWebBrowser2; 
      return wb != null && wb.Parent != null; 
     } 
    } 

    // ... 
} 

請注意,你必須確保你打電話從創建的web瀏覽器控件的線程的IsInsideFrame屬性,否則你可能會得到訪問衝突異常,just as described here

」 ......所有的IE的COM對象,包括WebBrowser控件,是單 Threaded單元對象這意味着,除其他事項外,你可以只 交流。將它們從創建它們的線程中刪除。如果您 需要從其他線程使用它們,你需要馬歇爾他們使用 的GIT或CoMarshallInterThreadInterfaceInStream()和相關職能 ......」

我希望這可以幫助別人了。


替代解決方案

由於I got AccessViolationExceptions訪問wb.Parent的時候,雖然我覺得我所做的一切正確的,我正在尋找替代解決方案。

我發現它在this Code Project article

基本上文章使用一種替代方法來確定框架。它通過比較對Web瀏覽器控件的引用來實現。

僞代碼:

public void BeforeNavigate2(
    object pDisp, 
    ref object url, 
    ref object flags, 
    ref object targetFrameName, 
    ref object postData, 
    ref object headers, 
    ref bool cancel) 
{ 
    // ... 

    var isTopFrame = _browser._axIWebBrowser2.Equals(pDisp); 

    // ... 
} 

我的測試運行成功,到目前爲止,我真的希望我弄沒了這些可怕的訪問衝突異常。

相關問題