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

时间:2013-05-30 17:01:15

标签: c# delphi winapi google-chrome

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

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

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

2 个答案:

答案 0 :(得分:9)

Chrome支持Windows辅助功能API,因此您可以使用这些API从Chrome(包括broswer栏)以及网页中提取信息。将此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))以查找ControlType为Edit的第一个元素。 FindFirst对树进行深度优先搜索,看起来它在这种情况下会起作用;如果你想自己一步一步地走路,可以使用TreeWalker类。
  • 使用以下命令将找到的元素“强制转换”为ValuePattern:ValuePattern vp =(ValuePattern)editEl.GetCurrentPattern(ValuePattern.Pattern);
  • 最后,使用string str = vp.Current.Value;获得编辑的价值。

答案 1 :(得分:2)

AFAIK你可以通过创建一个chrome扩展来实现这个目的,然后使用WebSockets与应用程序进行通信。

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

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