枚举 .NET 中特定进程的窗口
查找由特定进程创建的所有窗口是许多应用程序中的常见需求。在 .NET 中,可以使用多种方法来完成此任务。一种方法涉及枚举与目标进程关联的线程窗口。
使用 EnumThreadWindows 函数
user32.dll 库中的 EnumThreadWindows 函数允许枚举属于一个特定的线程。要枚举特定进程的窗口,您可以遍历其线程并为每个线程调用 EnumThreadWindows。
代码实现:
以下委托用作回调在 EnumThreadWindows:
delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
下面的代码片段使用进程 ID 枚举进程的窗口句柄(PID):
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); [STAThread] static void Main(string[] args) { foreach (var handle in EnumerateProcessWindowHandles( Process.GetProcessesByName("explorer").First().Id)) { StringBuilder message = new StringBuilder(1000); SendMessage(handle, WM_GETTEXT, message.Capacity, message); Console.WriteLine(message); } }
以上是如何枚举.NET中特定进程的Windows?的详细内容。更多信息请关注PHP中文网其他相关文章!