Magazine Internet

[PInvoke] Trouver toute les Windows d’un Process

Publié le 01 septembre 2009 par Jeremy.jeanson

Ces dernières semaine j’ai été amené à refaire pas mal d’interop avec l’ami user32.dll. Je me suis retrouvé face à un petit souci basic, mais contraignant : il n’existe pas de méthode qui retourne toutes les windows d’un process. Par contre il existe EnumThreadWindows qui elle énumère les windows d’un Thread. J’ai donc créer une méthode EnumProcessWindows qui utilise EnumThreadWindows.

Son usage est similaire à celui de EnumThreadWindows. Il faut donc lui passer une méthode de Callback qui serra lancée pour chaque windows découverte.

Vb

Imports System
Imports System.Text
Imports System.Runtime.InteropServices

Public Class mNativeMethods

    ''' <summary>
    ''' CallBack
    ''' </summary>
    ''' <param name="hWnd"></param>
    ''' <param name="lParam"></param>
    ''' <returns></returns>
    Public Delegate Function Win32CallBack(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean

    ''' <summary>
    ''' Enumérer les windows d'un Thread
    ''' </summary>
    ''' <param name="dwThreadId"></param>
    ''' <param name="callback"></param>
    ''' <param name="lParam"></param>
    ''' <returns></returns>
    <DllImport("user32.dll")> _
    Public Shared Function EnumThreadWindows( _
         ByVal dwThreadId As UInt32, _
         ByVal callback As Win32CallBack, _
         ByVal lParam As IntPtr) As Boolean
    End Function

    ''' <summary>
    ''' Enumérer les windows d'un process
    ''' </summary>
    ''' <param name="process"></param>
    ''' <param name="callback"></param>
    Public Shared Sub EnumProcessWindows( _
        ByVal process As System.Diagnostics.Process, _
        ByVal callback As Win32CallBack)
        For Each t As System.Diagnostics.ProcessThread In process.Threads
            EnumThreadWindows( _
                Convert.ToUInt32(t.Id), _
                callback, _
                IntPtr.Zero)
        Next
    End Sub
End Class

C#

using System;
using System.Text;
using System.Runtime.InteropServices;

public class NativeMethods
{
    /// <summary>
    /// CallBack
    /// </summary>
    /// <param name="hWnd"></param>
    /// <param name="lParam"></param>
    /// <returns></returns>
    public delegate Boolean Win32CallBack(IntPtr hWnd, IntPtr lParam);

    /// <summary>
    /// Enumérer les windows d'un Thread
    /// </summary>
    /// <param name="dwThreadId"></param>
    /// <param name="callback"></param>
    /// <param name="lParam"></param>
    /// <returns></returns>
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]    
    public static extern Boolean EnumThreadWindows(
        UInt32 dwThreadId,
        Win32CallBack callback,
        IntPtr lParam);

    /// <summary>
    /// Enumérer les windows d'un process
    /// </summary>
    /// <param name="process"></param>
    /// <param name="callback"></param>
    public static void EnumProcessWindows(
        System.Diagnostics.Process process,
        Win32CallBack callback)
    {
        foreach (System.Diagnostics.ProcessThread t in process.Threads)
        {
            EnumThreadWindows(
                Convert.ToUInt32(t.Id),
                callback,
                IntPtr.Zero);
        }
    }
}

Retour à La Une de Logo Paperblog

A propos de l’auteur


Jeremy.jeanson 1573 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte