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