如何从Chrome和Firefox获取打开网页的url?

我正在编写一个系统托盘应用程序,需要检查基于内部网络的应用程序是否已打开。

我可以使用以下方法检查IE:

SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows(); string filename; bool sdOpen = false; foreach (SHDocVw.InternetExplorer ie in shellWindows) { filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower(); if (filename.Equals("iexplore")) { string[] urlParts = (ie.LocationURL.ToString()).Split('/'); string website = urlParts[2]; if (website == "myApp:8080") { sdOpen = true; }; } } if (sdOpen) { Console.WriteLine("App is open"); } else { Console.WriteLine("App is not open"); }; Console.ReadKey(true); 

但是,部分使用该系统的用户更喜欢使用Chrome或Firefox。

如何为Chrome和Firefox执行与上述相同的操作(即获取浏览器中任何打开的标签的url)? (我不会打扰其他浏览器,因为这些是我们组织中唯一使用的浏览器。)

它特定于每个浏览器。 这是主要的:

  • Internet Explorer – 您可以使用SHDocVw(就像您一样)
  • Firefox – 您可以使用DDE获取URL(下面的源代码)
  • Chrome – 您可以在枚举所有子窗口的同时获取url,直到您使用“Chrome_OmniboxView”类获取控件,然后使用GetWindowText获取文本
  • Opera – 您可以使用与Firefox相同的function,但使用“opera”
  • Safari – 没有已知的方法,因为它使用自定义绘制的控件

编辑:自2014年以来,Chrome已更改,您需要获取具有Acessibility的URL。

使用DDE(使用NDDE – .NET唯一优秀的DDE包装器)从Firefox / Opera获取URL的代码:

 // // usage: GetBrowserURL("opera") or GetBrowserURL("firefox") // private string GetBrowserURL(string browser) { try { DdeClient dde = new DdeClient(browser, "WWW_GetWindowInfo"); dde.Connect(); string url = dde.Request("URL", int.MaxValue); string[] text = url.Split(new string[] { "\",\"" }, StringSplitOptions.RemoveEmptyEntries); dde.Disconnect(); return text[0].Substring(1); } catch { return null; } } 

使用UIAutomation – 获取FireFox和Chrome的url:

  else if (browser == BrowserType.Chrome) { //"Chrome_WidgetWin_1" Process[] procsChrome = Process.GetProcessesByName("chrome"); foreach (Process chrome in procsChrome) { // the chrome process must have a window if (chrome.MainWindowHandle == IntPtr.Zero) { continue; } //AutomationElement elm = AutomationElement.RootElement.FindFirst(TreeScope.Children, // new PropertyCondition(AutomationElement.ClassNameProperty, "Chrome_WidgetWin_1")); // 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 29.0.1547.76 m (currently the latest stable) var elm1 = elm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Google Chrome")); var elm2 = TreeWalker.ControlViewWalker.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.NameProperty, "Address and search bar")); } 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; } return ret; } } continue; } } } else if (browser == BrowserType.Firefox) { AutomationElement root = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "MozillaWindowClass")); Condition toolBar = new AndCondition( new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ToolBar), new PropertyCondition(AutomationElement.NameProperty, "Browser tabs")); var tool = root.FindFirst(TreeScope.Children, toolBar); var tool2 = TreeWalker.ControlViewWalker.GetNextSibling(tool); var children = tool2.FindAll(TreeScope.Children, Condition.TrueCondition); foreach (AutomationElement item in children) { foreach (AutomationElement i in item.FindAll(TreeScope.Children, Condition.TrueCondition)) { foreach (AutomationElement ii in i.FindAll(TreeScope.Children, Condition.TrueCondition)) { if (ii.Current.LocalizedControlType == "document") { if (!ii.Current.BoundingRectangle.X.ToString().Contains("Infinity")) { ValuePattern activeTab = ii.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern; var activeUrl = activeTab.Current.Value; return activeUrl; } } } } } } 

也许这段代码可以提供帮助; 感谢BLEZ分享这段代码。 我使用此代码从firefox捕获唯一地址并将其添加到列表框中。 但我认为这不适合Chrome吗?

(您应该将NDde.dll添加到您的项目中,要执行此操作,请转到解决方案资源管理器,右键单击引用 – >添加引用 – >浏览 – >找到该DLL( http://ndde.codeplex.com/来自二进制文件夹。)

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using NDde.Client; namespace WindowsFormsApplication9 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { timer1.Enabled = true; } private string GetBrowserURL(string browser) { try { DdeClient dde = new DdeClient(browser, "WWW_GetWindowInfo"); dde.Connect(); string url = dde.Request("URL", int.MaxValue); string[] text = url.Split(new string[] { "\",\"" }, StringSplitOptions.RemoveEmptyEntries); dde.Disconnect(); return text[0].Substring(1); } catch { return null; } } private void timer1_Tick(object sender, EventArgs e) { int j=0; for (int i = 0; i < listBox1.Items.Count; i++) { if (listBox1.Items[i].ToString() == GetBrowserURL("Firefox")) { break; } else { j++; } } if (j == listBox1.Items.Count) { listBox1.Items.Add(GetBrowserURL("Firefox")); } } } } 

以下代码适用于Chrome版本58.0.3029.110:

请在.NET提供的Assembly中添加UIAutomationClient和UIAutomationProvider的参考。

  foreach (Process proc in procsChrome) { // the chrome process must have a window if (proc.MainWindowHandle == IntPtr.Zero) continue; // to find the tabs we first need to locate something reliable - the 'New Tab' button AutomationElement root = AutomationElement.FromHandle(proc.MainWindowHandle); var SearchBar = root.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "Address and search bar")); if (SearchBar != null) return (string)SearchBar.GetCurrentPropertyValue(ValuePatternIdentifiers.ValueProperty); }