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