我正在研究一种传统软件,其中包括一个按钮,可以打开一个新的Internet Explorer窗口并导航到其中的特定地址。 浏览器控制器将保留对窗口的引用,以便如果再次按下该按钮 - 将使用相同的窗口再次导航到该窗口。
这基本上适用于SHDocVw.InternetExplorer对象,我只使用“navigte”方法,它在Windows XP(IE 6-8)上运行良好。
我们的客户希望升级到Windows 7,似乎MS决定通过在每次导航到不同的域时引发“OnQuit”事件来拧紧这段特定代码(并在此过程中添加安全性:))你在做什么(所以,如果我使用“Browser = new SHDocVw.InternetExplorer();”打开一个新窗口,而不是使用“Browser.Navigate(”www.google.com“),那么浏览器对象将被编组。
阅读这个问题似乎我不是唯一有这个问题的人,建议的解决办法是找到我打开并连接到它的IE窗口,所以我有这个功能:
private void FindIwdBrowser()
{
if (Browser != null)
return;
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();
foreach (var window in shellWindows)
{
SHDocVw.InternetExplorer foundBrowser = ((SHDocVw.InternetExplorer)window);
if (!foundBrowser.Name.EndsWith("Internet Explorer"))
continue;
if (foundBrowser.LocationURL.StartsWith(config.UrlTemplate.Substring(0, config.UrlTemplate.IndexOf("?"))))
{
Execute.OnUIThread(() =>
{
foundBrowser.OnQuit += Browser_OnQuit;
Browser = foundBrowser;
});
return;
}
}
}
这个解决方案有点......唯一的问题是,如果它是我打开的新窗口中的第一个标签 - 它不会识别它,如果它是第二个(即使我关闭了第一个此后它确实有效。
经过近一周疯狂搜索网络后,我决定在这里问一下好心人 - 也许你可以弄清楚为什么它的工作只有一半时间,或者如果我的策略存在缺陷,我应该尝试不同的方法。我宁愿不使用网络客户端控件,因为我导航的网站也是第三方,并且往往会崩溃很多,如果它将在我创建的webclient中 - 客户端可能会责怪我们的软件,我宁愿避免。
提前致谢!