【问题标题】:How to get the current URL from Chrome 28 from another Windows application?如何从另一个 Windows 应用程序从 Chrome 28 获取当前 URL?
【发布时间】:2013-05-26 08:53:49
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为这一更改在安全方面是一个极好的举措。能够在没有调试器的情况下破解它可能被视为 Chrome 28 中的一个错误(因此可能会发生变化)
  • @Eugen 让 url 阅读更尴尬一点也不安全。
  • 就我的口味而言,让外部应用程序难以读取是个好主意。
  • @Eugen 这不是一个外部应用程序。在同一台机器上运行的进程几乎可以看到该机器上其他进程中的所有内容。如果您因此认为 v28 更安全,那您就是在自欺欺人。
  • 任何书签收藏或文档管理软件都需要这个。

标签: c# delphi winapi google-chrome


【解决方案1】:

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

查看Inspect Objects 工具,了解您可以访问哪些信息 - 它确实看起来好像地址栏和内容可用。

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

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

【讨论】:

    【解决方案2】:

    AFAIK 你可以通过创建一个 chrome 扩展来做到这一点,然后使用 WebSockets 与应用程序通信。

    甚至还有一个 Web Socket 协议的 Delphi 实现(附示例)-> DelphiWs

    更多相关信息here。 那应该让你开始。

    【讨论】:

    • 我已经有一个通过 tcp/ip 进行通信的扩展。但问题是通信是 chrome -> myapp 而不是 myapp -> chrome。因此,用户可以单击 chrome 扩展程序中的按钮并将 URL 发送到我的应用程序,但是从 V28 开始,无法单击我的应用程序中的按钮并从 chrome 获取 URL。据我了解,在开发通道 chrome 版本之外的 chrome 扩展中无法使用 Web 套接字。
    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    相关资源
    最近更新 更多