使用C#从Google Chrome获取当前标签页的URL

过去,有一种方法可以FindWindowEx结合使用SendMessage调用来获取多功能框中当前显示的文字,从而从Google

Chrome浏览器中获取活动标签的网址。最近的(?)更新似乎已破坏了此方法,因为Chrome似乎现在正在呈现所有内容。(您可以使用Spy ++,AHK

Window Spy或Window Detective进行检查)

要在Firefox和Opera上获取当前URL,可以使用DDE和WWW_GetWindowInfo。Chrome似乎无法做到这一点(不再吗?)。

这个问题的答案提供了有关它如何工作的更多信息,这是这段代码(正如我所解释的,它不再起作用- hAddressBox0):

var hAddressBox = FindWindowEx(

intPtr,

IntPtr.Zero,

"Chrome_OmniboxView",

IntPtr.Zero);

var sb = new StringBuilder(256);

SendMessage(hAddressBox, 0x000D, (IntPtr)256, sb);

temp = sb.ToString();

所以我的问题是:是否有一种 方法来获取当前关注的选项卡的URL?(仅标题还不够)

回答:

看来我的答案中的代码不再AutomationElement适用于更高版本的Chrome版本(尽管使用的想法仍然有效),因此请查看其他答案以查找不同版本。例如,以下是适用于Chrome

54的设备:https :

//stackoverflow.com/a/40638519/377618

以下代码似乎有效(由于icemanind的评论),但是却占用大量资源。找到elmUrlBar大约需要350毫秒…有点慢。

更不用说我们有chrome同时运行多个进程的问题。

// there are always multiple chrome processes, so we have to loop through all of them to find the

// process with a Window Handle and an automation element of name "Address and search bar"

Process[] procsChrome = Process.GetProcessesByName("chrome");

foreach (Process chrome in procsChrome) {

// the chrome process must have a window

if (chrome.MainWindowHandle == IntPtr.Zero) {

continue;

}

// find the automation element

AutomationElement elm = AutomationElement.FromHandle(chrome.MainWindowHandle);

AutomationElement elmUrlBar = elm.FindFirst(TreeScope.Descendants,

new PropertyCondition(AutomationElement.NameProperty, "Address and search bar"));

// if it can be found, get the value from the URL bar

if (elmUrlBar != null) {

AutomationPattern[] patterns = elmUrlBar.GetSupportedPatterns();

if (patterns.Length > 0) {

ValuePattern val = (ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0]);

Console.WriteLine("Chrome URL found: " + val.Current.Value);

}

}

}

我对上面的慢速方法不满意,所以我使其速度更快(现在为50ms)并添加了一些URL验证,以确保获得正确的URL,而不是用户可能在网络上搜索的URL,或者仍然正在忙于输入URL。这是代码:

// there are always multiple chrome processes, so we have to loop through all of them to find the

// process with a Window Handle and an automation element of name "Address and search bar"

Process[] procsChrome = Process.GetProcessesByName("chrome");

foreach (Process chrome in procsChrome) {

// the chrome process must have a window

if (chrome.MainWindowHandle == IntPtr.Zero) {

continue;

}

// find the automation element

AutomationElement elm = AutomationElement.FromHandle(chrome.MainWindowHandle);

// manually walk through the tree, searching using TreeScope.Descendants is too slow (even if it's more reliable)

AutomationElement elmUrlBar = null;

try {

// walking path found using inspect.exe (Windows SDK) for Chrome 31.0.1650.63 m (currently the latest stable)

var elm1 = elm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Google Chrome"));

if (elm1 == null) { continue; } // not the right chrome.exe

// here, you can optionally check if Incognito is enabled:

//bool bIncognito = TreeWalker.RawViewWalker.GetFirstChild(TreeWalker.RawViewWalker.GetFirstChild(elm1)) != null;

var elm2 = TreeWalker.RawViewWalker.GetLastChild(elm1); // I don't know a Condition for this for finding :(

var elm3 = elm2.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, ""));

var elm4 = elm3.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ToolBar));

elmUrlBar = elm4.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Custom));

} catch {

// Chrome has probably changed something, and above walking needs to be modified. :(

// put an assertion here or something to make sure you don't miss it

continue;

}

// make sure it's valid

if (elmUrlBar == null) {

// it's not..

continue;

}

// elmUrlBar is now the URL bar element. we have to make sure that it's out of keyboard focus if we want to get a valid URL

if ((bool)elmUrlBar.GetCurrentPropertyValue(AutomationElement.HasKeyboardFocusProperty)) {

continue;

}

// there might not be a valid pattern to use, so we have to make sure we have one

AutomationPattern[] patterns = elmUrlBar.GetSupportedPatterns();

if (patterns.Length == 1) {

string ret = "";

try {

ret = ((ValuePattern)elmUrlBar.GetCurrentPattern(patterns[0])).Current.Value;

} catch { }

if (ret != "") {

// must match a domain name (and possibly "https://" in front)

if (Regex.IsMatch(ret, @"^(https:\/\/)?[a-zA-Z0-9\-\.]+(\.[a-zA-Z]{2,4}).*$")) {

// prepend http:// to the url, because Chrome hides it if it's not SSL

if (!ret.StartsWith("http")) {

ret = "http://" + ret;

}

Console.WriteLine("Open Chrome URL found: '" + ret + "'");

}

}

continue;

}

}

以上是 使用C#从Google Chrome获取当前标签页的URL 的全部内容, 来源链接: utcz.com/qa/413781.html

回到顶部