c# - 如何从另一个 Windows 应用程序获取 Chrome 28 的当前 URL?

标签 c# delphi winapi google-chrome

在 Chrome V27 之前,您可以枚举 Chrome 子窗口控件以到达编辑字段并从那里读取字符串值以获取当前打开的 URL。

不幸的是,Chrome 28 已切换到新的渲染引擎 (Blink),除了主窗口 (Chrome_WidgetWin_1) 和网页选项卡 (Chrome_RenderWidgetHostHWND) 之外,不再使用 Windows 控件。

如果有人能指出从另一个 (Win32) 应用程序获取当前打开的 Chrome URL 的替代方法,我将不胜感激。

最佳答案

Chrome 支持 Windows 辅助功能 API,因此您可以使用它们从 chrome(包括浏览器栏)和网页中提取信息。将此 API 视为枚举窗口控件的更抽象版本。

查看 Inspect Objects用于探索您可以访问哪些信息的工具 - 地址栏和内容看起来确实可用。

您可以在 C# 中使用 AutomationElement 获取相同的信息类集:

  • 使用 AutomationElement windowEl = AutomationElement.FromHandle(new IntPtr(hwnd)) ;作为起点,如果你知道树的 HWND
  • 然后尝试 AutomationElement editEl = AutomationElement.FindFirst (TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit )) 找到第一个 ControlType 为 Edit 的元素。 FindFirst 对树进行深度优先搜索,看起来在这种情况下会起作用;如果您想自己逐步行走,可以使用 TreeWalker 类。
  • 使用以下方法将找到的元素“转换”为 ValuePattern:ValuePattern vp = (ValuePattern) editEl.GetCurrentPattern(ValuePattern.Pattern) ;
  • 最后,使用 string str = vp.Current.Value;获得编辑的值(value)。

关于c# - 如何从另一个 Windows 应用程序获取 Chrome 28 的当前 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16841965/

相关文章:

c# - 设计游戏对象

delphi - 如何从两个同名接口(interface)实现两个方法?

vba - 调用 MS Access 查询,该查询从 Delphi ADO 组件调用模块中的 VBA 函数

c# - 我能否始终确定通过 FindWindowEx 找到的控件的层次顺序?

winapi - MSG 结构的时间成员采用什么格式?

c# - 类型 'Style' 的值不能添加到类型 'UIElementCollection' 的集合或字典中

c# - 如何从 Blazor 服务器端应用程序中的本地 Active Directory 实现身份验证?

C#:数据表线程安全问题

delphi - 如何在 Delphi 中添加和使用自定义包/组件中的资源?

VBA Outlook 如何在电子邮件正文中添加超链接