枚舉 .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中文網其他相關文章!