Получить название браузера Chrome с помощью c #

Допустим, у меня открыто несколько хромированных окон (не вкладки),
как я могу проверить название браузера?

Я попробовал следующее:

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

но он возвращает мне только последнее имя открытого windows, а все остальные – это пробелы.

    Я должен был сделать что-то подобное, но это было потрясающе сфокусировано на вызове функций Windows API. Проблема заключалась в том, что Chrome, похоже, использует один процесс для нескольких окон или какую-то другую странность, что означает, что простой подход не работает для меня.

    В любом случае, попробуйте это и посмотрите, работает ли он. В основном он использует имя classа windows Chrome (которое может быть Chrome_WidgetWin_0 или Chrome_WidgetWin_1 ), чтобы перечислять все windows с этим именем classа и возвращает названия окон для тех, которые не являются пустыми.

    Обратите внимание, что по какой-либо причине это также всегда возвращает заголовок Windows под названием "Chrome App Launcher" , поэтому вам может понадобиться отфильтровать его.

    Примечание. Вы также можете сделать это для Firefox с помощью «MozillaWindowClass» и для IE с помощью «IEFrame» (хотя любой из них может измениться с разными версиями).

     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); } } } 

    Я знаю, что это уже ответили, но я также сделал решение, которое перечисляет все Windows в streamе.

    Он был построен из решения Мэтью Уотсона, следовательно, некоторые сходства.

     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; } } } 

    Вы должны получить список процессов.

    Перейдем через список и только там, где имя «хром».

    Это позволит вам получить все заголовки.

    Потому что, если у вас более одного хромового процесса, ваш звонок даст вам только один, потому что вы вызываете его только один раз.

    Который он возвращает, возможно, другой вопрос. В вашем случае это последнее.

    Interesting Posts

    Как устранить неполадки, когда я не знаю, с чего начать?

    Как создать ярлык для настроек ПК?

    Как использовать переменные в одиночных кавычках?

    Как сделать туннель ssh открытым для публики?

    различия между использованием wmode = “transparent”, “opaque” или “window” для встроенного объекта на веб-странице

    Как я могу загрузить 100 файлов с похожими именами и / или строкой всего за один шаг в MATLAB?

    Какие эффекты могут иметь ключевое слово virtual в Entity Framework 4.1 POCO Code First?

    Как пользователь, как я могу открыть сайт во всплывающем окне без панелей инструментов?

    Функции jQuery для облегчения без использования плагина

    Эффективная реализация неизменяемого (двойного) LinkedList

    локальная переменная, инициализированная нулем в C

    Сопряжение эмуляторов Android и Wear

    Текстовая анимация WPF Marquee

    Android Studio – processDebugResources не удалось

    попытка повторного открытия уже закрытого объекта: SQLiteDatabase

    Давайте будем гением компьютера.