4

我正在使用ShDocVw互操作程序集来获取InternetExplorer对象。

foreach(InternetExplorer IE in new ShellWindowsClass())
{
   Console.Log(IE.HWND.ToString() + Environment.NewLine);
}

结果是 - 同一窗口报告的所有选项卡都HWND等于MainWindowHandle该窗口的进程。事实上,我在这些对象中找不到任何可以将它们彼此区分开来的不同信息。

而且我需要将这些实例与真实选项卡相关联,以便将它们与 Windows 事件匹配(主要是窗口焦点更改)。Frame Tab找到这个对象和相应的或TabWindowClass窗口实例之间的链接会很棒。

任何想法如何实现这一目标?

4

1 回答 1

4

好的,这并不完美,但这是我想出的:

  1. HWND从对象获取InternetExplorer,这是窗口的句柄。
  2. 使用EnumChildWindowsFindWindowEx遍历其子窗口并找到具有类的子窗口Frame Tab。你会得到一个-选项卡IntPtr tabHandle的句柄。我个人更喜欢这里,因为它不会使用回调,而是循环迭代......FindWindowEx
  3. 然后,FindWindowEx再次使用tabHandle#2 中发现的来找到一个有 class 的孩子TabWindowClass。你会得到IntPtr tabTitleHandle- 这是包含选项卡窗口标题的窗口(包括位置名称 +“ - internet explorer smth”,我写“smth”,因为这个文本可能会有所不同,因为可以自定义 MSIE 分发)。
  4. 使用GetWindowTextontabTitleHandle获取窗口标题。
  5. 现在,遍历集合InternetExplorer中的对象ShellWindowsClass,首先检查 PID - 我们只需要比较由同一进程创建的实例,然后检查您是否在 #4 中获得了窗口标题.StartsWith(IE.LocationName + " - ")。注意“ - ”,因为我们可以假设会有一些识别浏览器本身的文本,但由于它可以自定义 - 不能真正猜到它。如果窗口标题以位置名称开头,我们将假设它们相互关联。

正如我所说,这并不完美(因为最后一场比赛是按标题进行的),但这是我迄今为止获得的最好成绩。希望它会有所帮助。我仍在等待完美的解决方案,继续挖掘!;)

于 2012-08-15T13:19:01.820 回答