Maison >développement back-end >C++ >Comment récupérer toutes les fenêtres associées à un processus spécifique dans .NET ?

Comment récupérer toutes les fenêtres associées à un processus spécifique dans .NET ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-06 01:27:38992parcourir

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

Récupérer toutes les fenêtres appartenant à un processus spécifique dans .NET

L'énumération de toutes les fenêtres associées à un processus particulier est une tâche cruciale pour diverses automatisations et des scénarios de communication inter-processus. Dans .NET, cela peut être réalisé en tirant parti de l'API EnumThreadWindows, qui permet l'itération sur toutes les fenêtres créées par un thread spécifique.

Pour énumérer les fenêtres appartenant à un processus en fonction de son ID de processus (PID), suivez ces étapes :

  1. Importez la DLL nécessaire : [DllImport("user32.dll")]
  2. Définissez un délégué pour gérer l'énumération : délégué bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam)
  3. Créez un IEnumerable pour stocker les handles de fenêtre : var handles = new List()
  4. Parcourez tous les threads du processus cible en utilisant EnumThreadWindows :

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

Exemple d'utilisation :

Voici un exemple d'utilisation de la méthode EnumerateProcessWindowHandles pour récupérer les titres de fenêtres de toutes les fenêtres créées par le processus de l'Explorateur Windows :

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

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