Поиск всех окон процесса - 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);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы