Heim >Backend-Entwicklung >C++ >Wie rufe ich alle Windows ab, die einem bestimmten Prozess in .NET zugeordnet sind?

Wie rufe ich alle Windows ab, die einem bestimmten Prozess in .NET zugeordnet sind?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-06 01:27:38975Durchsuche

How to Retrieve All Windows Associated with a Specific Process in .NET?

Abrufen aller Fenster, die zu einem bestimmten Prozess in .NET gehören

Das Aufzählen aller Fenster, die zu einem bestimmten Prozess gehören, ist eine entscheidende Aufgabe für verschiedene Automatisierungen und prozessübergreifende Kommunikationsszenarien. In .NET kann dies durch die Nutzung der EnumThreadWindows-API erreicht werden, die die Iteration durch alle von einem bestimmten Thread erstellten Fenster ermöglicht.

Um Fenster, die zu einem Prozess gehören, basierend auf seiner Prozess-ID (PID) aufzuzählen, befolgen Sie die folgenden Schritte diese Schritte:

  1. Importieren Sie die erforderliche DLL: [DllImport("user32.dll")]
  2. Delegieren Sie einen Delegaten, um die Enumeration zu verarbeiten: Delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam)
  3. Erstellen Sie ein IEnumerable zum Speichern der Fensterhandles: var Griffe = neu List()
  4. Durchlaufen Sie alle Threads des Zielprozesses mit EnumThreadWindows:

    foreach (ProcessThread thread in Process.GetProcessById(processId).Threads)
         EnumThreadWindows(thread.Id, 
             (hWnd, lParam) => { handles.Add(hWnd); return true; }, IntPtr.Zero);

Beispielverwendung:

Hier ist ein Beispiel für die Verwendung der EnumerateProcessWindowHandles-Methode So rufen Sie die Fenstertitel aller vom Windows Explorer-Prozess erstellten Fenster ab:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public class Program
{
    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);
        }
    }

    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;
    }
}

Das obige ist der detaillierte Inhalt vonWie rufe ich alle Windows ab, die einem bestimmten Prozess in .NET zugeordnet sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn