使用 .NET 识别和枚举特定进程的窗口
查找由特定进程创建的所有窗口对于各种人来说都是一项有价值的任务目的。使用 C#,可以通过利用 EnumThreadWindows 函数有效地实现这一点。
首先,获取要列出其窗口的应用程序的进程 ID (PID)。接下来,为属于该进程的每个线程调用 EnumThreadWindows。该函数接受一个回调委托,该委托将窗口句柄作为参数,如果枚举应该继续,则返回 true。在此委托中,将句柄添加到集合中。
以下是枚举属于进程的所有窗口的 C# 代码:
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); [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); } }
以上是如何使用 C# 识别并列出属于特定进程的所有 Windows?的详细内容。更多信息请关注PHP中文网其他相关文章!