Obtenga el título del navegador Chrome usando c #

Digamos que tengo varias ventanas de Chrome abiertas (no tabs),
¿Cómo puedo verificar el título del navegador?

Intenté lo siguiente:

Process[] p = Process.GetProcessesByName("chrome"); foreach (Process item in p) { Console.WriteLine(item.MainWindowTitle); } 

pero me devuelve solo el último nombre de ventana abierta y todos los demás son espacios en blanco.

Tuve que hacer algo como esto, pero fue sorprendentemente complicado implicar funciones de la API de Windows. El problema era que Chrome parece usar un solo proceso para varias ventanas o alguna otra rareza que significaba que el enfoque simple no funcionaba para mí.

De todos modos, prueba esto y mira si funciona. Básicamente usa el nombre de la clase de la ventana de Chrome (que podría ser Chrome_WidgetWin_0 o Chrome_WidgetWin_1 ) para enumerar todas las ventanas con ese nombre de clase, y devuelve los títulos de las ventanas para aquellos que no están en blanco.

Tenga en cuenta que esto también siempre devuelve un título de Windows llamado "Chrome App Launcher" por algún motivo, por lo que es posible que tenga que filtrarlo.

Nota: también puede hacer esto para Firefox usando “MozillaWindowClass” y para IE utilizando “IEFrame” (aunque es probable que alguno de ellos cambie con diferentes versiones).

 using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Security; using System.Text; namespace Demo { class WindowsByClassFinder { public delegate bool EnumWindowsDelegate(IntPtr hWnd, IntPtr lparam); [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage"), SuppressUnmanagedCodeSecurity] [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage"), SuppressUnmanagedCodeSecurity] [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public extern static bool EnumWindows(EnumWindowsDelegate lpEnumFunc, IntPtr lparam); [SuppressMessage("Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage"), SuppressUnmanagedCodeSecurity] [DllImport("User32", CharSet=CharSet.Auto, SetLastError=true)] public static extern int GetWindowText(IntPtr windowHandle, StringBuilder stringBuilder, int nMaxCount); [DllImport("user32.dll", EntryPoint = "GetWindowTextLength", SetLastError = true)] internal static extern int GetWindowTextLength(IntPtr hwnd); /// Find the windows matching the specified class name. public static IEnumerable WindowsMatching(string className) { return new WindowsByClassFinder(className)._result; } private WindowsByClassFinder(string className) { _className = className; EnumWindows(callback, IntPtr.Zero); } private bool callback(IntPtr hWnd, IntPtr lparam) { if (GetClassName(hWnd, _apiResult, _apiResult.Capacity) != 0) { if (string.CompareOrdinal(_apiResult.ToString(), _className) == 0) { _result.Add(hWnd); } } return true; // Keep enumerating. } public static IEnumerable WindowTitlesForClass(string className) { foreach (var windowHandle in WindowsMatchingClassName(className)) { int length = GetWindowTextLength(windowHandle); StringBuilder sb = new StringBuilder(length + 1); GetWindowText(windowHandle, sb, sb.Capacity); yield return sb.ToString(); } } public static IEnumerable WindowsMatchingClassName(string className) { if (string.IsNullOrWhiteSpace(className)) throw new ArgumentOutOfRangeException("className", className, "className can't be null or blank."); return WindowsMatching(className); } private readonly string _className; private readonly List _result = new List(); private readonly StringBuilder _apiResult = new StringBuilder(1024); } class Program { void run() { ChromeWindowTitles().Print(); } public IEnumerable ChromeWindowTitles() { foreach (var title in WindowsByClassFinder.WindowTitlesForClass("Chrome_WidgetWin_0")) if (!string.IsNullOrWhiteSpace(title)) yield return title; foreach (var title in WindowsByClassFinder.WindowTitlesForClass("Chrome_WidgetWin_1")) if (!string.IsNullOrWhiteSpace(title)) yield return title; } static void Main() { new Program().run(); } } static class DemoUtil { public static void Print(this object self) { Console.WriteLine(self); } public static void Print(this string self) { Console.WriteLine(self); } public static void Print(this IEnumerable self) { foreach (var item in self) Console.WriteLine(item); } } } 

Sé que esto ya está respondido, pero también he hecho una solución, que enumera todas las ventanas dentro de un hilo.

Fue construido a partir de la solución de Matthew Watson, de ahí algunas similitudes.

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Runtime.InteropServices; namespace Chrome_Windows { class Program { [DllImport("user32.dll")] private static extern bool EnumThreadWindows(uint dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); [DllImport("User32", CharSet = CharSet.Auto, SetLastError = true)] public static extern int GetWindowText(IntPtr windowHandle, StringBuilder stringBuilder, int nMaxCount); [DllImport("user32.dll", EntryPoint = "GetWindowTextLength", SetLastError = true)] internal static extern int GetWindowTextLength(IntPtr hwnd); private static List windowList; private static string _className; private static StringBuilder apiResult = new StringBuilder(256); //256 Is max class name length. private delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam); static void Main(string[] args) { List ChromeWindows = WindowsFinder("Chrome_WidgetWin_1", "chrome"); foreach (IntPtr windowHandle in ChromeWindows) { int length = GetWindowTextLength(windowHandle); StringBuilder sb = new StringBuilder(length + 1); GetWindowText(windowHandle, sb, sb.Capacity); Console.WriteLine(sb.ToString()); } } private static List WindowsFinder(string className, string process) { _className = className; windowList = new List(); Process[] chromeList = Process.GetProcessesByName(process); if (chromeList.Length > 0) { foreach (Process chrome in chromeList) { if (chrome.MainWindowHandle != IntPtr.Zero) { foreach (ProcessThread thread in chrome.Threads) { EnumThreadWindows((uint)thread.Id, new EnumThreadDelegate(EnumThreadCallback), IntPtr.Zero); } } } } return windowList; } static bool EnumThreadCallback(IntPtr hWnd, IntPtr lParam) { if (GetClassName(hWnd, apiResult, apiResult.Capacity) != 0) { if (string.CompareOrdinal(apiResult.ToString(), _className) == 0) { windowList.Add(hWnd); } } return true; } } } 

Debe obtener una lista de procesos.

Itere a través de la lista y solo donde el nombre es “cromo”.

Esto le permitirá obtener todos los títulos.

Porque si tiene más de un proceso de cromo, su llamada le dará solo uno, porque lo llama solo una vez.

Lo que devuelve es quizás otra pregunta. En tu caso, es el último.