我需要能够在Windows机器上列出所有活动的应用程序。 我一直在使用这个代码…
Process[] procs = Process.GetProcesses("."); foreach (Process proc in procs) { if (proc.MainWindowTitle.Length > 0) { toolStripComboBox_StartSharingProcessWindow.Items.Add(proc.MainWindowTitle); } }
直到我意识到当多个文件在各自的窗口中打开时,这不会列出像WORD或ACROREAD这样的情况。 在这种情况下,只有使用上述技术列出最上面的窗口。 我认为这是因为即使打开两个(或更多)文件,也只有一个进程。 所以,我想我的问题是:我如何列出所有的窗口,而不是他们的基本过程?
在user32.dll中使用EnumWindows。 像这样的事情会做你想做的事情。
public delegate bool WindowEnumCallback(int hwnd, int lparam); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool EnumWindows(WindowEnumCallback lpEnumFunc, int lParam); [DllImport("user32.dll")] public static extern void GetWindowText(int h, StringBuilder s, int nMaxCount); [DllImport("user32.dll")] public static extern bool IsWindowVisible(int h); private List<string> Windows = new List<string>(); private bool AddWnd(int hwnd, int lparam) { if (IsWindowVisible(hwnd)) { StringBuilder sb = new StringBuilder(255); GetWindowText(hwnd, sb, sb.Capacity); Windows.Add(sb.ToString()); } return true } private void Form1_Load(object sender, EventArgs e) { EnumWindows(new WindowEnumCallback(this.AddWnd), 0); }