obtener los títulos de todas las ventanas abiertas

¿Cómo puedo recuperar los títulos de todas las ventanas abiertas (incluyendo ventanas como tabs en Internet Explorer)?

Algo como esto:

using System.Diagnostics; Process[] processlist = Process.GetProcesses(); foreach (Process process in processlist) { if (!String.IsNullOrEmpty(process.MainWindowTitle)) { Console.WriteLine("Process: {0} ID: {1} Window title: {2}", process.ProcessName, process.Id, process.MainWindowTitle); } } 

Basado en la respuesta anterior que me da algunos errores, finalmente uso este código con la función GetOpenedWindows :

 public class InfoWindow { public IntPtr Handle = IntPtr.Zero; public FileInfo File = new FileInfo( Application.ExecutablePath ); public string Title = Application.ProductName; public override string ToString() { return File.Name + "\t>\t" + Title; } }//CLASS /// Contains functionality to get info on the open windows. public static class RuningWindows { internal static event EventHandler WindowActivatedChanged; internal static Timer TimerWatcher = new Timer(); internal static InfoWindow WindowActive = new InfoWindow(); internal static void DoStartWatcher() { TimerWatcher.Interval = 500; TimerWatcher.Tick += TimerWatcher_Tick; TimerWatcher.Start(); } /// Returns a dictionary that contains the handle and title of all the open windows. /// A dictionary that contains the handle and title of all the open windows. public static IDictionary GetOpenedWindows() { IntPtr shellWindow = GetShellWindow(); Dictionary windows = new Dictionary(); EnumWindows( new EnumWindowsProc( delegate( IntPtr hWnd , int lParam ) { if ( hWnd == shellWindow ) return true; if ( !IsWindowVisible( hWnd ) ) return true; int length = GetWindowTextLength( hWnd ); if ( length == 0 ) return true; StringBuilder builder = new StringBuilder( length ); GetWindowText( hWnd , builder , length + 1 ); var info = new InfoWindow(); info.Handle = hWnd; info.File = new FileInfo( GetProcessPath( hWnd ) ); info.Title = builder.ToString(); windows[hWnd] = info; return true; } ) , 0 ); return windows; } private delegate bool EnumWindowsProc( IntPtr hWnd , int lParam ); public static string GetProcessPath( IntPtr hwnd ) { uint pid = 0; GetWindowThreadProcessId( hwnd , out pid ); if ( hwnd != IntPtr.Zero ) { if ( pid != 0 ) { var process = Process.GetProcessById( (int) pid ); if ( process != null ) { return process.MainModule.FileName.ToString(); } } } return ""; } [DllImport( "USER32.DLL" )] private static extern bool EnumWindows( EnumWindowsProc enumFunc , int lParam ); [DllImport( "USER32.DLL" )] private static extern int GetWindowText( IntPtr hWnd , StringBuilder lpString , int nMaxCount ); [DllImport( "USER32.DLL" )] private static extern int GetWindowTextLength( IntPtr hWnd ); [DllImport( "USER32.DLL" )] private static extern bool IsWindowVisible( IntPtr hWnd ); [DllImport( "USER32.DLL" )] private static extern IntPtr GetShellWindow(); [DllImport( "user32.dll" )] private static extern IntPtr GetForegroundWindow(); //WARN: Only for "Any CPU": [DllImport( "user32.dll" , CharSet = CharSet.Auto , SetLastError = true )] private static extern int GetWindowThreadProcessId( IntPtr handle , out uint processId ); static void TimerWatcher_Tick( object sender , EventArgs e ) { var windowActive = new InfoWindow(); windowActive.Handle = GetForegroundWindow(); string path = GetProcessPath( windowActive.Handle ); if ( string.IsNullOrEmpty( path ) ) return; windowActive.File = new FileInfo( path ); int length = GetWindowTextLength( windowActive.Handle ); if ( length == 0 ) return; StringBuilder builder = new StringBuilder( length ); GetWindowText( windowActive.Handle , builder , length + 1 ); windowActive.Title = builder.ToString(); if ( windowActive.ToString() != WindowActive.ToString() ) { //fire: WindowActive = windowActive; if ( WindowActivatedChanged != null ) WindowActivatedChanged( sender , e ); Console.WriteLine( "Window: " + WindowActive.ToString() ); } } }//CLASS 

Advertencia: solo puede comstackr / depurar en “Cualquier CPU” para acceder a aplicaciones de 32 bits …

Aquí hay un código que puede usar para obtener una lista de todas las ventanas abiertas. En realidad, obtienes un diccionario donde cada elemento es un KeyValuePair donde la clave es el manejador (hWnd) de la ventana y el valor es su título.

 using HWND = IntPtr; /// Contains functionality to get all the open windows. public static class OpenWindowGetter { /// Returns a dictionary that contains the handle and title of all the open windows. /// A dictionary that contains the handle and title of all the open windows. public static IDictionary GetOpenWindows() { HWND shellWindow = GetShellWindow(); Dictionary windows = new Dictionary(); EnumWindows(delegate(HWND hWnd, int lParam) { if (hWnd == shellWindow) return true; if (!IsWindowVisible(hWnd)) return true; int length = GetWindowTextLength(hWnd); if (length == 0) return true; StringBuilder builder = new StringBuilder(length); GetWindowText(hWnd, builder, length + 1); windows[hWnd] = builder.ToString(); return true; }, 0); return windows; } private delegate bool EnumWindowsProc(HWND hWnd, int lParam); [DllImport("USER32.DLL")] private static extern bool EnumWindows(EnumWindowsProc enumFunc, int lParam); [DllImport("USER32.DLL")] private static extern int GetWindowText(HWND hWnd, StringBuilder lpString, int nMaxCount); [DllImport("USER32.DLL")] private static extern int GetWindowTextLength(HWND hWnd); [DllImport("USER32.DLL")] private static extern bool IsWindowVisible(HWND hWnd); [DllImport("USER32.DLL")] private static extern IntPtr GetShellWindow(); } 

Y aquí hay un código que lo usa:

 foreach(KeyValuePair window in OpenWindowGetter.GetOpenWindows()) { IntPtr handle = window.Key; string title = window.Value; Console.WriteLine("{0}: {1}", handle, title); } 

Crédito: http://www.tcx.be/blog/2006/list-open-windows/

deberías usar la API EnumWindow .

hay muchos ejemplos sobre cómo usarlo desde C #, encontré algo aquí:

Obtener las Manijas de Ventana de la Aplicación

Problema con EnumWindows

http://pinvoke.net/default.aspx/user32.EnumDesktopWindows

Hay un ejemplo de uso de EnumWindow de user.dll en C # para mostrar todas las ventanas abiertas.

Hera es la función UpdateWindowsList_WindowMenu () a la que debe llamar después de realizar cualquier operación en las tabs. Aquí, windowToolStripMenuItem es el elemento de menú agregado al menú de la ventana a la barra de menú.

 public void UpdateWindowsList_WindowMenu() { //get all tab pages from tabControl1 TabControl.TabPageCollection tabcoll = tabControl1.TabPages; //get windowToolStripMenuItem drop down menu items count int n = windowToolStripMenuItem.DropDownItems.Count; //remove all menu items from of windowToolStripMenuItem for (int i = n - 1; i >=2; i--) { windowToolStripMenuItem.DropDownItems.RemoveAt(i); } //read each tabpage from tabcoll and add each tabpage text to windowToolStripMenuItem foreach (TabPage tabpage in tabcoll) { //create Toolstripmenuitem ToolStripMenuItem menuitem = new ToolStripMenuItem(); String s = tabpage.Text; menuitem.Text = s; if (tabControl1.SelectedTab == tabpage) { menuitem.Checked = true; } else { menuitem.Checked = false; } //add menuitem to windowToolStripMenuItem windowToolStripMenuItem.DropDownItems.Add(menuitem); //add click events to each added menuitem menuitem.Click += new System.EventHandler(WindowListEvent_Click); } } private void WindowListEvent_Click(object sender, EventArgs e) { //casting ToolStripMenuItem to ToolStripItem ToolStripItem toolstripitem = (ToolStripItem)sender; //create collection of tabs of tabContro1 //check every tab text is equal to clicked menuitem then select the tab TabControl.TabPageCollection tabcoll = tabControl1.TabPages; foreach (TabPage tb in tabcoll) { if (toolstripitem.Text == tb.Text) { tabControl1.SelectedTab = tb; //call UpdateWindowsList_WindowMenu() to perform changes on menuitems UpdateWindowsList_WindowMenu(); } } }