在C#中调用ShellWindows FindWindowSW方法

时间:2018-10-02 20:02:25

标签: c# com shdocvw

我正在编写一个小型应用程序,它将启动Internet Explorer并打开一个未知列表或URL,它们是新窗口还是现有窗口中的新标签页(取决于特定站点的设置)。正在启动的网站可以在任何Internet区域中。我可以使用SHDocVw方法打开新的Windows和选项卡。

我正在尝试找出一种跟踪上次打开的Internet Explorer参考的方法,以便可以使用该参考来打开选项卡。

我遇到了一种情况,由于“松散耦合的Internet Explorer”(LCIE)和IE保护模式,我启动的IE实例被关闭,而另一个实例又被自动启动(IE虚拟选项卡切换)。这会导致我失去对原始IE的引用,并且在尝试打开选项卡时失败。

我想使用ShellWindows FindWindowSW方法来获取特定的窗口(基于ShellWindows cookie值),但是我无法使其正常工作。 有人可以指出我正确的方向吗?

private InternetExplorer GetLastExplorer(int cookie)
{
  object _m = Type.Missing;
  const int SWC_BROWSER = 0x00000001;
  const int SWFO_COOKIEPASSED = 4;
  int pHWND;           

  _shellWindows.FindWindowSW(cookie, ref _m, SWC_BROWSER, out pHWND, 5);

  foreach (InternetExplorer window in _shellWindows)
  {
    if (window.HWND == pHWND)
    return window;
  }
 return null;
}

1 个答案:

答案 0 :(得分:0)

我无法解决这个问题,因此不得不采取其他方法。我结束了以下操作,以获取最后打开的IE实例:

private InternetExplorer _lastInternetExplorer;
private List<InternetExplorer> _existingInternetExplorers = new List<InternetExplorer>();
private static ShellWindows _shellWindows = new ShellWindows();
_shellWindows.WindowRegistered += OnShellWindowRegistered;

private void OnShellWindowRegistered(int lCookie)
{
  foreach (InternetExplorer window in _shellWindows)
  {
    if (!_existingInternetExplorers.Contains(window))
    {
      _lastInternetExplorer = window;
      _existingInternetExplorers.Add(window);
    }
  }        
}