我正在开发一个遗留软件,其中有一个按钮,可以打开一个新的 Internet Explorer 窗口并导航到其中的特定地址。浏览器控制器将保存对窗口的引用,以便如果再次按下按钮 - 将使用相同的窗口再次导航到它。
这基本上适用于 SHDocVw.InternetExplorer 对象,我只使用“navigte”方法,它完美地工作......在 Windows XP(IE 6-8)上。
我们的客户希望升级到 Windows 7,似乎 MS 决定在您每次导航到与您以前不同的域时引发“OnQuit”事件来搞砸这段特定的代码(并在过程中增加安全性:))在(因此,如果我使用“Browser = new SHDocVw.InternetExplorer();”打开一个新窗口,而不是使用“Browser.Navigate(“www.google.com”),Browser 对象将被编组。
通读这个问题,似乎我不是唯一一个遇到这个问题的人,建议的解决方案是找到我打开的 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;
}
}
}
- Execute.OnUIThread - 我使用 caliburn micro,想确保它不是线程问题
- config.UrlTemplate - 我要导航到的 URL
这个解决方案有效......有点,唯一的问题是,如果它是我打开的新窗口中的第一个选项卡 - 它无法识别它,如果它是第二个(即使我之后关闭第一个)它确实有效。
在互联网上疯狂搜索了将近一周后,我决定在这里问一下伟大的思想 - 也许你可以弄清楚为什么它只工作了一半,或者我的策略是否有缺陷,我应该尝试不同的方法。
我宁愿不使用 Web 客户端控件,因为我要导航的网站也是第 3 方,并且往往会崩溃很多,如果它在我创建的 Web 客户端中 - 客户端可能会责怪我们的软件,我宁愿避免。
提前致谢!