得到所有打开的窗口的标题

如何检索所有打开的窗口的标题(包括Internet Explorer中的选项卡等窗口)?

Solutions Collecting From Web of "得到所有打开的窗口的标题"

像这样的东西:

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

基于以前给我一些错误的答案,最后我用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 /// <summary>Contains functionality to get info on the open windows.</summary> 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(); } /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary> /// <returns>A dictionary that contains the handle and title of all the open windows.</returns> public static IDictionary<IntPtr , InfoWindow> GetOpenedWindows() { IntPtr shellWindow = GetShellWindow(); Dictionary<IntPtr , InfoWindow> windows = new Dictionary<IntPtr , InfoWindow>(); 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.Mainmodulee.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 

警告:您只能在“任何CPU”下编译/调试以访问32位应用程序…

你应该使用EnumWindow API。

有很多关于如何从C#使用它的例子,我在这里找到了一些东西:

获取应用程序的窗口句柄

问题与EnumWindows

这里有一些代码可以用来获取所有打开的窗口列表。 实际上,你得到一个字典,其中每个项目是一个KeyValuePair,其中的关键是窗口句柄(hWnd),值是它的标题。

 using HWND = IntPtr; /// <summary>Contains functionality to get all the open windows.</summary> public static class OpenWindowGetter { /// <summary>Returns a dictionary that contains the handle and title of all the open windows.</summary> /// <returns>A dictionary that contains the handle and title of all the open windows.</returns> public static IDictionary<HWND, string> GetOpenWindows() { HWND shellWindow = GetShellWindow(); Dictionary<HWND, string> windows = new Dictionary<HWND, string>(); 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(); } 

以下是一些使用它的代码:

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

信用: http : //www.tcx.be/blog/2006/list-open-windows/

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

有一个在C#中使用user.dll的EnumWindow来列出所有打开的窗口的例子。

Hera的函数UpdateWindowsList_WindowMenu(),你必须调用任何操作后,在Tabs.Here windowToolStripMenuItem是菜单项添加到窗口菜单菜单条。

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