C# 连接到现有的Internet explorer窗口并使用C重新使用它#

C# 连接到现有的Internet explorer窗口并使用C重新使用它#,c#,windows,internet-explorer,shdocvw,C#,Windows,Internet Explorer,Shdocvw,我正在开发一个遗留软件,其中包括一个按钮,可以打开新的internet explorer窗口并导航到其中的特定地址。 浏览器控制器将保留对窗口的引用,这样,如果再次按下按钮,将使用同一窗口再次导航到该窗口 这基本上适用于SHDocVw.InternetExplorer对象,我只使用了“navigte”方法,它可以完美地工作。。。在Windows XP(IE 6-8)上 我们的客户希望升级到windows 7,似乎MS决定在每次您导航到与您所在的域不同的域时引发“OnQuit”事件(因此,如果我使

我正在开发一个遗留软件,其中包括一个按钮,可以打开新的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;
        }
    }
}
  • 我使用caliburn micro,希望确保它不是线程问题
  • config.UrlTemplate-我要导航到的URL
这个解决方案是有效的……有点,唯一的问题是,如果它是我打开的新窗口中的第一个选项卡-它无法识别它,如果它是第二个选项卡(即使我关闭了之后的第一个选项卡),它确实有效

在疯狂地搜索了将近一周的互联网后,我决定问问这里的伟人——也许你能找出为什么它只起到一半的作用,或者我的策略是否有缺陷,我应该尝试另一种方法

我不想使用web客户端控件,因为我导航的网站也是第三方,而且往往会崩溃很多,如果它在我创建的web客户端中,客户端可能会责怪我们的软件,我宁愿避免


提前感谢!

但是常规的WebBrowserControl会使您的软件崩溃吗?也许使用IE打开的网站在稳定性方面并不出色,但是嵌入式IE中的网站不会使您的应用程序崩溃……因为我的客户端是由具有短期记忆的人组成的(也就是说,尽管我在过去两年中有两个bug,而创建网站的那些bug……更多),但我还是希望确保它明显分开,如果我没有选择的话,我自然会这样做,但我真的很想避免。此外,这对我来说是一个非常有趣的琐事:)如果在子窗口中打开WebBrowser控件时使用类似于“由Internet Explorer提供动力”的文本,或者更好!!“由Internet Explorer 6提供动力”的文本,该怎么办。这会将仇恨重定向到Microsoft:D Uhm…顺便说一句,我会选择一个简单的解决方案,而不是避免可能的客户仇恨使整个解决方案复杂化。LOL!嗯,MS自1996年以来一直为我提供工作,所以我不希望有太多仇恨指向他们,控件使用兼容模式(可通过我无权访问的注册表值更改),所以…我不能,因为我没有提供安装文件,只有一个可执行文件。你甚至可以从整个可执行文件中写入注册表项。为什么不呢?