我正在使用ShDocVw
互操作程序集来访问InternetExplorer
个对象。
foreach(InternetExplorer IE in new ShellWindowsClass())
{
Console.Log(IE.HWND.ToString() + Environment.NewLine);
}
结果是 - 同一窗口的所有标签报告HWND
等于该窗口过程的MainWindowHandle
。实际上,我无法在这些对象中找到任何不同的信息,这些信息会将它们彼此区分开来。
我需要将这些实例与实际标签相关联,以便将它们与Windows事件(主要是窗口焦点更改)相匹配。很高兴找到此对象与相应的Frame Tab
或TabWindowClass
窗口实例之间的链接。
任何想法如何实现这一目标?
答案 0 :(得分:4)
好的,这并不完美,但这就是我想出的:
InternetExplorer
对象获取HWND
,这是窗口的句柄。EnumChildWindows
或FindWindowEx
遍历其chlidren并找到具有类Frame Tab
的子窗口。您将获得IntPtr tabHandle
- 标签的句柄。我个人更喜欢FindWindowEx
,因为它不会使用回调,而是循环迭代...... FindWindowEx
使用tabHandle
,以便找到课程为TabWindowClass
的孩子。您将获得IntPtr tabTitleHandle
- 这是包含标签窗口标题的窗口(其中包含位置名称+“ - Internet explorer smth”,我写“smth”,因为此文本可能会有所不同,因为MSIE分布可以定制)。GetWindowText
上使用tabTitleHandle
获取窗口标题。InternetExplorer
集合中的ShellWindowsClass
个对象,首先检查PID - 我们只需要比较同一个进程创建的实例,然后检查你在#4中获得的窗口标题.StartsWith(IE.LocationName + " - ")
。注意“ - ”,因为我们可以假设会有一些文本标识浏览器本身,但由于它可以自定义 - 无法真正猜测它。如果窗口标题以位置名称开头,我们将假设它们是相同的。正如我所说,这并不完美(因为最后一场比赛是由冠军制作的),但这是迄今为止我所取得的最好成绩。希望它会有所帮助。我仍在等待完美的解决方案,继续挖掘人! ;)