使用WebBrowser
control,我目前無法檢測Navigating
event是否由於主頁面的URL正在更改或是否加載了IFRAME而觸發。可能檢測是否在導航事件中加載了IFRAME?
無論我將哪些屬性放入IFRAME,Frame
參數始終爲空。
我的問題:
是否有任何機會/訣竅從Navigating
事件處理程序中確定,該事件是否是由一個IFRAME觸發?
使用WebBrowser
control,我目前無法檢測Navigating
event是否由於主頁面的URL正在更改或是否加載了IFRAME而觸發。可能檢測是否在導航事件中加載了IFRAME?
無論我將哪些屬性放入IFRAME,Frame
參數始終爲空。
我的問題:
是否有任何機會/訣竅從Navigating
事件處理程序中確定,該事件是否是由一個IFRAME觸發?
找到了一個解決辦法:
我不得不執行附加DWebBrowserEvents2
interface在this Code Project article描述來獲得額外的事件。
然後,我在BeforeNavigate2
event收到通知,提供更多信息。
我發現pDisp
是IWebBrowser2
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 AccessViolationException
s訪問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);
// ...
}
我的測試運行成功,到目前爲止,我真的希望我弄沒了這些可怕的訪問衝突異常。