gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:23:11 27 4
gpt4 key购买 nike

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

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

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

而且我需要将这些实例与真实选项卡相关联,以便将它们与 Windows 事件相匹配(主要是窗口焦点变化)。如果能找到此对象与相应的 Frame TabTabWindowClass 窗口实例之间的链接,那就太好了。

有什么想法可以实现吗?

最佳答案

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

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

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

关于c# - 需要一种方法来区分 ShDocVw.InternetExplorer 选项卡对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11948992/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com