从C#在已有的IE窗口中打开一个URL的选项卡

15
以下代码会在浏览器Exe指向Firefox、Safari或Chrome时,在现有的浏览器窗口中打开链接。当指向IEXPLORE.EXE(IE7)时,则会打开一个新窗口。
ProcessStartInfo pi = new ProcessStartInfo(browserExe, url);
Process.Start(pi);

当IE是默认浏览器时,此代码将在现有窗口中打开一个选项卡,它的行为与预期相符。

ProcessStartInfo pi = new ProcessStartInfo(url);
Process.Start(pi);

当IE不是默认浏览器时,如何重用现有的IE窗口?

1个回答

29

使用shdocvw库(添加对它的引用,你可以在windows\system32中找到它)可以获取实例列表,并使用newtab参数调用navigate:

ShellWindows iExplorerInstances = new ShellWindows();
if (iExplorerInstances.Count > 0)
{
  IEnumerator enumerator = iExplorerInstances.GetEnumerator();
  enumerator.MoveNext();
  InternetExplorer iExplorer = (InternetExplorer)enumerator.Current;
  iExplorer.Navigate(url, 0x800); //0x800 means new tab
}
else
{
  //No iexplore running, use your processinfo method
}
编辑:在某些情况下,您可能需要检查shell窗口是否对应于真正的iexplorer而不是任何其他Windows shell(在w7中返回所有实例,现在不知道其他情况)。
编辑注释:在某些情况下,您需要检查Shell窗口是否对应于真正的Internet Explorer浏览器,而不是任何其他Windows壳程序。在Windows 7中,所有实例都会被返回,但其他版本可能会有所不同。
   bool found=false;
   foreach (InternetExplorer iExplorer in iExplorerInstances)
   {
       if (iExplorer.Name == "Windows Internet Explorer")
       {
           iExplorer.Navigate(ur, 0x800);
           found=true;
           break;
       }
   }
   if(!found)
   {
      //run with processinfo
   }

你可能会发现这些额外的IE Navigate标志也很有用。 标志的完整描述可在http://msdn.microsoft.com/en-us/library/dd565688(v=vs.85).aspx找到。

enum BrowserNavConstants 
{ 
    navOpenInNewWindow = 0x1, 
    navNoHistory = 0x2, 
    navNoReadFromCache = 0x4, 
    navNoWriteToCache = 0x8, 
    navAllowAutosearch = 0x10, 
    navBrowserBar = 0x20, 
    navHyperlink = 0x40, 
    navEnforceRestricted = 0x80, 
    navNewWindowsManaged = 0x0100, 
    navUntrustedForDownload = 0x0200, 
    navTrustedForActiveX = 0x0400, 
    navOpenInNewTab = 0x0800, 
    navOpenInBackgroundTab = 0x1000, 
    navKeepWordWheelText = 0x2000, 
    navVirtualTab = 0x4000, 
    navBlockRedirectsXDomain = 0x8000, 
    navOpenNewForegroundTab = 0x10000 
};

5
运行得很好。有没有办法从枚举器中找到最后使用的浏览器窗口?(与在电子邮件中单击链接时相同的行为)。 - Fedearne
这不会在IE本身中打开新选项卡,而是在您的默认浏览器中打开(例如,在IE已经打开的情况下)。仍然很棒的工作... - nawfal
我简直不敢相信IE和Chrome、Firefox的默认行为有如此大的不同。令人头痛。 - BraveNewMath
1
对于那些找不到参考的人,它可以在COM下找到,称为Microsoft Internet Controls。这种解决方案的另一个示例可以在这里找到:http://www.thepicketts.org/2013/05/how-to-open-a-new-tab-in-an-existing-internet-explorer-instance-in-c/。 - Hugo M. Zuleta
有人测试过在Citrix内从应用程序启动浏览器并跳转到用户桌面吗? - Dhawalk
将名称从“Windows Internet Explorer”更改为“Internet Explorer”,然后它就可以正常工作了...谢谢 ((: - AmirHossein Rezaei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接