Поиск всех окон процесса - C#
Формулировка задачи:
есть процесс, имя которого мы знаем, у него есть куча окон, например до 100 окон, имена у всех кроме главного абсолютно рандомные, как их всех найти?
в C# я слаб,
пытался сам но этот код показывает только имя активного процесса, а мне нужны все, а также хэнды всех
Заранее спасибо за помощь.
int i; int l; System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName("xxx"); l = procs.Length; if (l > 0) { for (i = 1; i <= procs.Length; i++) { System.Windows.Forms.MessageBox.Show(procs[i - 1].MainWindowTitle); } }
Решение задачи: «Поиск всех окон процесса»
textual
Листинг программы
namespace WindowsFormsApplication1 { using System; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; public partial class Form1 : Form { delegate bool EnumWindowsProc ( IntPtr hWnd, IntPtr lParam ); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool EnumWindows ( EnumWindowsProc lpEnumFunc, IntPtr lParam ); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool EnumChildWindows ( IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam ); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool IsWindowVisible ( IntPtr hWnd ); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetParent ( IntPtr hWnd ); [DllImport("user32.dll", SetLastError = true)] static extern int GetWindowText ( IntPtr hWnd, StringBuilder lpString, int nMaxCount ); [DllImport("user32.dll", SetLastError = true)] static extern int GetClassName ( IntPtr hWnd, StringBuilder lpString, int nMaxCount ); [DllImport("user32.dll", SetLastError = true)] static extern int GetWindowTextLength ( IntPtr hWnd ); public Form1() { InitializeComponent(); } private void button1_Click ( object sender, EventArgs e ) { TreeNode node; treeView1.BeginUpdate(); { treeView1.Nodes.Clear(); checkBox1.Enabled = false; EnumWindows(new EnumWindowsProc(( hWnd, lParam ) => { if (!checkBox1.Checked || IsWindowVisible(hWnd)) { node = new TreeNode(string.Format("{0:X8} "{1}" {2}", hWnd.ToInt32(), GetWindowText(hWnd), GetWindowClass(hWnd))); AddChildWindow(hWnd, node); treeView1.Nodes.Add(node); } return true; }), IntPtr.Zero); checkBox1.Enabled = true; } treeView1.EndUpdate(); } void AddChildWindow ( IntPtr hWndParent, TreeNode node ) { EnumChildWindows(hWndParent, new EnumWindowsProc(( hWnd, lParam ) => { if (GetParent(hWnd) != hWndParent) return true; if (!checkBox1.Checked || IsWindowVisible(hWnd)) { // Информация выводится ввиде: HANDLE [HEX] "ЗАГОЛОВОК" КЛАСС AddChildWindow(hWnd, node.Nodes.Add(string.Format("{0:X8} "{1}" {2}", hWnd.ToInt32(), GetWindowText(hWnd), GetWindowClass(hWnd)))); } return true; }), IntPtr.Zero); } // Получаем заголовок окна string GetWindowText ( IntPtr hWnd ) { int len = GetWindowTextLength(hWnd) + 1; StringBuilder sb = new StringBuilder(len); len = GetWindowText(hWnd, sb, len); return sb.ToString(0, len); } // Получаем класс окна string GetWindowClass ( IntPtr hWnd ) { int len = 260; // В принципе можно и побольше взять, // но я ещё не видел классы с именем // длиннее 260 символов. StringBuilder sb = new StringBuilder(len); len = GetClassName(hWnd, sb, len); return sb.ToString(0, len); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д