需要一种方法来区分ShDocVw.InternetExplorer选项卡对象

时间:2012-08-14 09:01:35

标签: c# internet-explorer tabs shdocvw

我正在使用ShDocVw互操作程序集来访问InternetExplorer个对象。

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

结果是 - 同一窗口的所有标签报告HWND等于该窗口过程的MainWindowHandle。实际上,我无法在这些对象中找到任何不同的信息,这些信息会将它们彼此区分开来。

我需要将这些实例与实际标签相关联,以便将它们与Windows事件(主要是窗口焦点更改)相匹配。很高兴找到此对象与相应的Frame TabTabWindowClass窗口实例之间的链接。

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

1 个答案:

答案 0 :(得分:4)

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

  1. InternetExplorer对象获取HWND,这是窗口的句柄。
  2. 使用EnumChildWindowsFindWindowEx遍历其chlidren并找到具有类Frame Tab的子窗口。您将获得IntPtr tabHandle - 标签的句柄。我个人更喜欢FindWindowEx,因为它不会使用回调,而是循环迭代......
  3. 然后,再次对#2中发现的FindWindowEx使用tabHandle,以便找到课程为TabWindowClass的孩子。您将获得IntPtr tabTitleHandle - 这是包含标签窗口标题的窗口(其中包含位置名称+“ - Internet explorer smth”,我写“smth”,因为此文本可能会有所不同,因为MSIE分布可以定制)。
  4. GetWindowText上使用tabTitleHandle获取窗口标题。
  5. 现在,遍历InternetExplorer集合中的ShellWindowsClass个对象,首先检查PID - 我们只需要比较同一个进程创建的实例,然后检查你在#4中获得的窗口标题.StartsWith(IE.LocationName + " - ")。注意“ - ”,因为我们可以假设会有一些文本标识浏览器本身,但由于它可以自定义 - 无法真正猜测它。如果窗口标题以位置名称开头,我们将假设它们是相同的。
  6. 正如我所说,这并不完美(因为最后一场比赛是由冠军制作的),但这是迄今为止我所取得的最好成绩。希望它会有所帮助。我仍在等待完美的解决方案,继续挖掘人! ;)