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

C# 如何从另一个Windows应用程序中从Chrome 28获取当前URL?,c#,delphi,winapi,google-chrome,C#,Delphi,Winapi,Google Chrome,在Chrome V27之前,您可以枚举Chrome子窗口控件以访问编辑字段,并从中读取字符串值以获取当前打开的URL 不幸的是,Chrome 28已切换到新的渲染引擎(Blink),除了主窗口(Chrome_WidgetWin_1)和网页选项卡(Chrome_RenderWidgetHostHWND)之外,不再使用Windows控件 如果有人能指出从另一个(Win32)应用程序获取当前打开的Chrome URL的另一种方法,我将不胜感激。好的,您可以创建一个Chrome扩展,然后使用WebSoc

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

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


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

好的,您可以创建一个Chrome扩展,然后使用WebSocket与应用程序通信

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

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

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

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

您可以使用C#中的一组类获得相同的信息:

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

  • 我认为这一改变是安全的明智之举。能够在没有调试器的情况下破解它可能会被认为是Chrome 28中的一个bug(因此可能会发生更改)@Eugen让url读取变得有点尴尬根本没有安全性。就我的口味而言,让它难以从外部应用程序读取是一个好主意。@Eugen它不是一个外部应用程序。在同一台机器上运行的进程几乎可以看到该机器上其他进程中的所有内容。如果你因此认为v28更安全,那你是在欺骗自己。任何书签收集或文档管理软件都需要这个。我已经有了一个通过tcp/ip进行通信的扩展。但问题是通信是chrome->myapp,而不是myapp->chrome。因此,用户可以单击chrome扩展中的一个按钮,并将URL发送到我的应用程序,但从V28开始,不可能在我的应用程序中单击一个按钮并从chrome获取URL。据我所知,在开发频道chrome版本之外的chrome扩展中不可能使用web套接字。