Maison >développement back-end >C++ >Comment énumérer les fenêtres d'un processus spécifique dans .NET ?

Comment énumérer les fenêtres d'un processus spécifique dans .NET ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-05 21:14:48876parcourir

How to Enumerate Windows of a Specific Process in .NET?

Énumération des fenêtres d'un processus spécifique dans .NET

La recherche de toutes les fenêtres créées par un processus spécifique est une exigence courante dans de nombreuses applications. Dans .NET, plusieurs méthodes sont disponibles pour réaliser cette tâche. Une approche consiste à énumérer les fenêtres de thread associées au processus cible.

Utilisation de la fonction EnumThreadWindows

La fonction EnumThreadWindows de la bibliothèque user32.dll permet l'énumération de toutes les fenêtres appartenant à un fil particulier. Pour énumérer les fenêtres d'un processus spécifique, vous pouvez parcourir ses threads et appeler EnumThreadWindows pour chaque thread.

Implémentation du code :

Le délégué suivant est utilisé comme rappel dans EnumThreadWindows :

delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

L'extrait de code suivant énumère les handles de fenêtre d'un processus à l'aide de son ID de processus (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;
}

Exemple d'utilisation :

Pour démontrer l'utilisation, vous pouvez récupérer les titres des fenêtres et les imprimer sur la console :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn