Aktuelle URL aus der C # -Formularanwendung abrufen

Ich habe ein Programm mit Visual C # entworfen und bin auf ein Problem gestoßen, dass mein Programm mit Webbrowsern interagieren lässt. Grundsätzlich muss ich die URL-Adresse von einem Webbrowser (Internet Explorer, Firefox, Chrome usw.) abrufen.

Ich dachte mir, dies wäre keine allzu schwierige Aufgabe, aber nach Tagen und Tagen der Forschung und Tests scheint es fast unmöglich! Bis jetzt bin ich auf dieses … gestoßen

Hol dir die Firefox URL?

Welche hat den Code unten:

using NDde.Client; Class Test { public static string GetFirefoxURL() { DdeClient dde = new DdeClient("Firefox", "WWW_GetWindowInfo"); dde.Connect(); string url = dde.Request("URL", int.MaxValue); dde.Disconnect(); return url; } } 

Das ist perfekt für Firefox, aber aus irgendeinem Grund kann ich es nicht mit etwas anderem arbeiten. Ich habe den Teil des Codes, der “Firefox” sagt, zu “Iexplore” geändert, wie ich es im Internet gefunden habe, zusammen mit dem Versuch, andere Formen des Ausdrucks von Internet Explorer auszuprobieren, und ich bekomme den folgenden Fehler:

“Client konnte keine Verbindung zu” IExplorer | WWW_GetWindowInfo “herstellen. Stellen Sie sicher, dass die Serveranwendung ausgeführt wird und das angegebene Dienstname- und Themenname-Paar unterstützt.”

Jede Hilfe zu diesem Thema würde sehr geschätzt werden, da es eine ziemliche Aufgabe ist, herauszufinden.

Hier ist, was ich bis jetzt habe (obwohl ich in Chrome keine hilfreichen Artikel finde, außer FindWindowEx zu verwenden (ich persönlich mag diese Methode nicht besonders).

 public class BrowserLocation { ///  /// Structure to hold the details regarding a browed location ///  public struct URLDetails { ///  /// URL (location) ///  public String URL; ///  /// Document title ///  public String Title; } #region Internet Explorer // requires the following DLL added as a reference: // C:\Windows\System32\shdocvw.dll ///  /// Retrieve the current open URLs in Internet Explorer ///  ///  public static URLDetails[] InternetExplorer() { System.Collections.Generic.List URLs = new System.Collections.Generic.List(); var shellWindows = new SHDocVw.ShellWindows(); foreach (SHDocVw.InternetExplorer ie in shellWindows) URLs.Add(new URLDetails() { URL = ie.LocationURL, Title = ie.LocationName }); return URLs.ToArray(); } #endregion #region Firefox // This requires NDde // http://ndde.codeplex.com/ public static URLDetails[] Firefox() { NDde.Client.DdeClient dde = new NDde.Client.DdeClient("Firefox", "WWW_GetWindowInfo"); try { dde.Connect(); String url = dde.Request("URL", Int32.MaxValue); dde.Disconnect(); Int32 stop = url.IndexOf('"', 1); return new URLDetails[]{ new URLDetails() { URL = url.Substring(1, stop - 1), Title = url.Substring(stop + 3, url.Length - stop - 8) } }; } catch (Exception) { return null; } } #endregion } class Program { static void Main(string[] args) { Console.WriteLine("Internet Explorer: "); (new List(BrowserLocation.InternetExplorer())).ForEach(u => { Console.WriteLine("[{0}]\r\n{1}\r\n", u.Title, u.URL); }); Console.WriteLine(); Console.WriteLine("Firefox:"); (new List(BrowserLocation.Firefox())).ForEach(u => { Console.WriteLine("[{0}]\r\n{1}\r\n", u.Title, u.URL); }); Console.WriteLine(); } } 

Hier ist ein Code basierend auf Microsoft UI Automation :

 public static string GetChromeUrl(Process process) { if (process == null) throw new ArgumentNullException("process"); if (process.MainWindowHandle == IntPtr.Zero) return null; AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle); if (element == null) return null; AutomationElement edit = element.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)); return ((ValuePattern)edit.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string; } public static string GetInternetExplorerUrl(Process process) { if (process == null) throw new ArgumentNullException("process"); if (process.MainWindowHandle == IntPtr.Zero) return null; AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle); if (element == null) return null; AutomationElement rebar = element.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "ReBarWindow32")); if (rebar == null) return null; AutomationElement edit = rebar.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)); return ((ValuePattern)edit.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string; } public static string GetFirefoxUrl(Process process) { if (process == null) throw new ArgumentNullException("process"); if (process.MainWindowHandle == IntPtr.Zero) return null; AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle); if (element == null) return null; AutomationElement doc = element.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Document)); if (doc == null) return null; return ((ValuePattern)doc.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string; } 

Sie können das UI Spy-Tool verwenden , um die visuelle Hierarchie für alle 3 Browser zu verstehen. Sie müssen möglicherweise Dinge anpassen, um sicherzustellen, dass es wirklich in Ihren spezifischen Fällen funktioniert, aber Sie sollten die allgemeine Idee mit diesen Beispielen erhalten.

Und ein Beispiel, das alle URLs für alle 3 processarten (IE, FF, CH) ablegt, die momentan im System laufen:

 static void Main(string[] args) { foreach (Process process in Process.GetProcessesByName("firefox")) { string url = GetFirefoxUrl(process); if (url == null) continue; Console.WriteLine("FF Url for '" + process.MainWindowTitle + "' is " + url); } foreach (Process process in Process.GetProcessesByName("iexplore")) { string url = GetInternetExplorerUrl(process); if (url == null) continue; Console.WriteLine("IE Url for '" + process.MainWindowTitle + "' is " + url); } foreach (Process process in Process.GetProcessesByName("chrome")) { string url = GetChromeUrl(process); if (url == null) continue; Console.WriteLine("CH Url for '" + process.MainWindowTitle + "' is " + url); } } 

Verwenden Sie den Parameter “1” anstelle von “URL” in “oDde.Request” (“URL”, int.MaxValue) für IE.

  public static void ProcessIEURLs() { string sURL; try { DdeClient oDde = new DdeClient("IExplore", "WWW_GetWindowInfo"); try { oDde.Connect(); sURL = oDde.Request("1", int.MaxValue); oDde.Disconnect(); bool bVisited = false; if ( oVisitedURLList != null && oVisitedURLList.Count > 0 ) { bVisited = FindURL(sURL, oVisitedURLList); } if ( !bVisited ) { oVisitedURLList.Add(sURL); } } catch ( Exception ex ) { throw ex; } } catch ( Exception ex ) { throw ex; } } 

Mourier, danke für deine Lösung Microsoft UI Automation . Auch wenn es für Firefox 41.0 nicht funktionierte, analysierte ich die Firefox-Fensterstruktur mit dem kleinen Tool “Automation Spy “. Dann habe ich die Suchbedingungen etwas geändert, und es hat perfekt funktioniert!

  public static string GetFirefoxUrl(Process process) { if (process == null) throw new ArgumentNullException("process"); if (process.MainWindowHandle == IntPtr.Zero) return null; AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle); if (element == null) return null; element = element.FindFirst(TreeScope.Subtree, new AndCondition( new PropertyCondition(AutomationElement.NameProperty, "search or enter address", PropertyConditionFlags.IgnoreCase), new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit))); if (element == null) return null; return ((ValuePattern)element.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string; } 

Und hier ist die Lösung für Chromium 48:

  public static string GetChromeUrl(Process process) { if (process == null) throw new ArgumentNullException("process"); if (process.MainWindowHandle == IntPtr.Zero) return null; AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle); if (element == null) return null; AutomationElement edit = element.FindFirst(TreeScope.Subtree, new AndCondition( new PropertyCondition(AutomationElement.NameProperty, "address and search bar", PropertyConditionFlags.IgnoreCase), new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit))); return ((ValuePattern)edit.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string; } 

Automation Spy zeigt die Struktur der Firefox-Fenstersteuerung. Das Steuerelement vom Typ ‘Bearbeiten’ mit dem Namen ‘Suchen oder Adresse eingeben’ enthält die URL: Automatisierungsspion

Hinweis: In Ihrem .NET Projekt benötigen Sie 2 Referenzen:

  • UIAutomationClient.dll
  • UIAutomationTypes.dll

WWW_GetWindowInfo wird im IE unterstützt und ist seit Version 3.02 wieder in den 16 Bit-Tagen! functioniert für Firefox und Opera

Ich glaube, dass Chrome in der Tat die Ausnahme ist.

Ich weiß nicht, wie es um diese vier geht.

Die beste Wahl ist, selenium-Webdriver zu verwenden. Beste und Power voll api mit voller Prämisse