Примерно так:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn,
IntPtr lParam);
static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processId)
{
var handles = new List<IntPtr>();
foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
EnumThreadWindows(thread.Id,
(hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);
return handles;
}
private const uint WM_GETTEXT = 0x000D;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam,
StringBuilder lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetClassName(IntPtr hWnd,
StringBuilder lpClassName,
int nMaxCount
);
public static string GetWindowClassName(IntPtr hWnd)
{
StringBuilder buffer = new StringBuilder(128);
GetClassName(hWnd, buffer, buffer.Capacity);
return buffer.ToString().Trim();
}
public static string GetWindowName(IntPtr hWnd)
{
StringBuilder message = new StringBuilder(1000);
SendMessage(hWnd, WM_GETTEXT, message.Capacity, message);
return message.ToString().Trim();
}
public static IntPtr FindWindowByNameInProcess(string windowName, string processName)
{
var processWindowHandles = EnumerateProcessWindowHandles(
Process.GetProcessesByName("explorer").First().Id);
foreach (var handle in processWindowHandles)
{
if (GetWindowName(handle).StartsWith(windowName))
{
return handle;
}
}
return IntPtr.Zero;
}
public static IntPtr FindWindowByClassInProcess(string windowClassName, string processName)
{
var processWindowHandles = EnumerateProcessWindowHandles(
Process.GetProcessesByName("explorer").First().Id);
foreach (var handle in processWindowHandles)
{
if (GetWindowClassName(handle).StartsWith(windowClassName))
{
return handle;
}
}
return IntPtr.Zero;
}
public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumChildWindows(IntPtr hWndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
[STAThread]
static void Main(string[] args)
{
foreach (var handle in EnumerateProcessWindowHandles(
Process.GetProcessesByName("explorer").First().Id))
{
Console.WriteLine("Name: " + GetWindowName(handle));
Console.WriteLine("Class: " + GetWindowClassName(handle));
}
// поиск по имени класса
var hwnd = FindWindowByClassInProcess("tool", "explorer");
if (hwnd != IntPtr.Zero)
{
Console.WriteLine("Finded Name: " + GetWindowName(hwnd));
Console.WriteLine("Finded Class: " + GetWindowClassName(hwnd));
}
// поиск по имени окна
hwnd = FindWindowByNameInProcess("Меню", "explorer");
if (hwnd != IntPtr.Zero)
{
Console.WriteLine("Finded Name: " + GetWindowName(hwnd));
Console.WriteLine("Finded Class: " + GetWindowClassName(hwnd));
var childWindows = new List<IntPtr>();
EnumChildWindows(
hwnd,
(childHandle, lParam) =>
{
childWindows.Add(childHandle);
return true;
},
IntPtr.Zero);
foreach (var handle in childWindows)
{
Console.WriteLine("Child Window Name: " + GetWindowName(handle));
Console.WriteLine("Child Window Class: " + GetWindowClassName(handle));
}
}
Console.ReadLine();
}
}
}