Вызов метода ShellWindows FindWindowSW в C # - PullRequest
0 голосов
/ 02 октября 2018

Я пишу небольшое приложение, которое запустит Internet Explorer и откроет неизвестный список или URL-адреса, либо в виде новых окон, либо в виде новых вкладок в существующих окнах (в зависимости от настроек для данного конкретного сайта).Запускаемые сайты могут быть в любой интернет-зоне.Я могу использовать методы SHDocVw для открытия новых окон и вкладок.

Я пытаюсь найти способ отследить последнюю открытую ссылку Internet Explorer, чтобы я мог использовать эту ссылку для открытия вкладок.

Я сталкиваюсь с ситуацией, когда из-за «слабосвязанного Internet Explorer» (LCIE) и защищенного режима IE запускаемый мной экземпляр IE закрывается, а другой автоматически запускается (переключение виртуальной вкладки IE)).Это приводит к тому, что я теряю ссылку на исходный IE, и при попытке открыть вкладку происходит сбой.

Я хотел бы использовать метод ShellWindows FindWindowSW, чтобы получить конкретное окно (на основе файла cookie ShellWindowsценность), но я не могу заставить его работать.Может ли кто-нибудь указать мне правильное направление?

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 голосов
/ 03 октября 2018

Я не мог заставить это работать, и мне пришлось использовать другой подход.В итоге я сделал следующее, чтобы получить последний открытый экземпляр 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);
    }
  }        
}
...