我正在學習從華廷它處理啓動並連接到Internet Explorer下面的一段代碼:華廷,IE瀏覽器啓動和IWebBrowser2的窗口句柄
private static IEBrowser CreateIEPartiallyInitializedInNewProcess(Uri uri)
{
var m_Proc = CreateIExploreInNewProcess(uri);
var helper = new AttachToIeHelper();
var action = new TryFuncUntilTimeOut(TimeSpan.FromSeconds(Settings.AttachToBrowserTimeOut))
{
SleepTime = TimeSpan.FromMilliseconds(500)
};
var ie = action.Try(() =>
{
m_Proc.Refresh();
var mainWindowHandle = m_Proc.MainWindowHandle;
// return mainWindowHandle != IntPtr.Zero ? GetIWebBrowser2Directly(mainWindowHandle) : null;
return mainWindowHandle != IntPtr.Zero
? helper.FindIEPartiallyInitialized(new AttributeConstraint("hwnd", mainWindowHandle.ToString()))
: null;
});
if (ie != null) return ie._ieBrowser;
// if (ie != null) return new IEBrowser(ie);
throw new BrowserNotFoundException("IE", "Timeout while waiting to attach to newly created instance of IE.", Settings.AttachToBrowserTimeOut);
}
什麼華廷做的是,它啓動Internet Explorer和等待直到它得到它.MainWindowHandle(這是「窗口」在Internet Explorer中顯示內容的句柄)。一旦獲得了該窗口句柄的保留,它就會獲得在用戶桌面上運行的所有IWebBrowser2窗口的列表,並嘗試將該進程的.MainWindowHandle與一個(如果有的話)源自窗口句柄的窗口句柄IWebBrowser2集合。
這種方法最顯著的問題是,IWebBrowser2.HWND財產(以比較.MainWindowHandle需要)可非常問題,不穩定,因爲它引發InvalidCastException每個其他時間,當您試圖訪問的氣質感它(至少在我正在運行的機器上進行測試)。然後再次有這種操作的開銷。
這裏是我的問題,任何人都可能更知識淵博,我在Windows編程:因爲HWNDs會匹配反正爲什麼我們不使用.MainWindowHandle值從蝙蝠檢索所需的IWebBrowser2(請參閱以上註釋的代碼)通過使用以下方法(由華廷本身使用內部ShellWindow2.cs)的代碼啓發:
private static IWebBrowser2 GetIWebBrowser2Directly(IntPtr embeddedWebBrowserWindowHandle)
{
IHTMLDocument2 document2 = UtilityClass.TryFuncIgnoreException(() => IEUtils.IEDOMFromhWnd(embeddedWebBrowserWindowHandle));
if (document2 == null) return null;
IHTMLWindow2 parentWindow = UtilityClass.TryFuncIgnoreException(() => document2.parentWindow);
if (parentWindow == null) return null;
return UtilityClass.TryFuncIgnoreException(() => ShellWindows2.RetrieveIWebBrowser2FromIHtmlWindw2Instance(parentWindow));
}
(作爲旁註,我們甚至可以使一個代理對象,在我的另一個交描述,以緩存窗口句柄,以避免詢問IWebBrowser2.HWND)。
這對我來說工作得很好。我看不到任何HWND之間的衝突或不匹配 - 不知道是否有我可能錯過的一個角落案例。我很想在WatiN論壇上詢問這個問題,但我想先在程序員中心問一下,以防萬一我錯過了一些明顯的東西。
謝謝大家提前。任何提示讚賞。
乾杯, 多米尼克