10

Up to Chrome V27 you could enumerate Chrome child window controls to get to the edit field and read the string value from there to get the current opened URL.

Unfortunately Chrome 28 has switched to the new rendering Engine (Blink) and does not use Windows controls anymore besides the main window (Chrome_WidgetWin_1) and the web page tab (Chrome_RenderWidgetHostHWND).

I would be grateful if someone could point to an alternative method of getting the currently opened Chrome URL from another (Win32) application.

4

2 回答 2

11

Chrome supports the Windows accessibility APIs, so you can use those to extract information both from the chrome - including the broswer bar - and also from web pages. Think of this API as a more abstract version of enumerating window controls.

Check out the Inspect Objects tool to explore what information you can get access to - it does look as though the address bar and contents are available.

You can get the same information in C# using the AutomationElement set of classes:

  • use AutomationElement windowEl = AutomationElement.FromHandle(new IntPtr(hwnd)); as a starting point if you know the HWND of the tree
  • then try AutomationElement editEl = AutomationElement.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)) to find the first element that has ControlType of Edit. FindFirst does a depth-first search of the tree, which looks like it will work in this case; can use the TreeWalker classes if you want to walk step-by-step yourself.
  • 'cast' the found element to a ValuePattern using: ValuePattern vp = (ValuePattern) editEl.GetCurrentPattern(ValuePattern.Pattern);
  • Finally, use string str = vp.Current.Value; to get the value of the edit.
于 2013-05-31T08:45:09.397 回答
3

AFAIK you could do this by creating a chrome extension which then communicates with the application using WebSockets.

There's even a Delphi implementation of the Web Socket protocol(with examples) -> DelphiWs

More relevant info here. That should get you started.

于 2013-05-30T18:02:34.430 回答