.NET での特定のプロセスのウィンドウの列挙
特定のプロセスによって作成されたすべてのウィンドウを検索することは、多くのアプリケーションで共通の要件です。 .NET では、このタスクを実行するためにいくつかの方法が使用できます。 1 つのアプローチには、ターゲット プロセスに関連付けられたスレッド ウィンドウを列挙することが含まれます。
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 で特定のプロセスのウィンドウを列挙するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。