Lister toutes les top-level windows d'un processus

[Résolu]
Signaler
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
-
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
-
Bonjour,

Comment fait-on pour récupérer les noms et handles de toutes les top-level windows d'un processus? Supposons que pipo.exe a lancé 3 fenêtres (top level, visibles dans la barre des tâches), comment je récupère ces infos? J'ai pas réussi à trouver de solution...

Merci :)

4 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Salut, tu as trouvé 90% de la solution..

[ DllImport( "user32.dll" ) ]
private static extern IntPtr WindowFromPoint( Point p );


[ DllImport( "user32.dll" ) ]
private static extern IntPtr ChildWindowFromPoint( IntPtr hWndParent, Point p );


[ DllImport( "user32.dll", SetLastError = true ) ]
private static extern int MapWindowPoints(
    IntPtr hWndFrom, IntPtr hWndTo, ref Point lpPoints, uint cPoints );


[ DllImport( "user32.dll" ) ]
private static extern uint GetWindowThreadProcessId( IntPtr hWnd, out uint lpdwProcessId );


public IntPtr GetWindowFromPoint( Point p )
{
    IntPtr hWndParent = WindowFromPoint( p );


    if ( hWndParent != IntPtr.Zero )
    {
        MapWindowPoints( IntPtr.Zero, hWndParent, ref p, 1 );
        IntPtr hWndChild = ChildWindowFromPoint( hWndParent, p );


        if ( hWndChild != IntPtr.Zero )
            return hWndChild;
    }


    return hWndParent;
}


// Close ou Dispose le processus à la fin.
public Process GetProcessFromPoint( Point p )
{
    try
    {
        IntPtr hWnd = GetWindowFromPoint( p );
        if ( hWnd != IntPtr.Zero )
        {
            uint processId;
            GetWindowThreadProcessId( hWnd, out processId );
            return Process.GetProcessById( ( int )processId );
        }
    }
    catch
    {
        // ..
    }


    return null;
}
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
Je progresse... J'arrive à recupe les HWND des fenetres avec EnumDesktopWindows, je peux meme recuperer le process id associés avec GetWindowThreadProcessId, mais j'arrive toujours pas à récupérer le nom de l'executable qui possède cette fenêtre ou ce process id :(

Pourtant ya moyen, si on clique sur une fenetre dans Microsoft Spy++, dans l'onglet "process" on a le process id, si on clique dessus, il nous sort le bon module name...
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
Bon voilà j'abandonne, jme suis simplifié la tache et j'ai utlisé FindWindowEx en filtrant par la bonne classe.

Du coup impossible de vérifier à coup sur que le hWnd appartient bien à pipo.exe, mais faudrait vraiment avoir pas de bol pour avoir un autre programme qui utilise exactement le même nom de classe pour ses fenêtres...
Messages postés
339
Date d'inscription
dimanche 26 janvier 2003
Statut
Membre
Dernière intervention
25 mars 2009
5
Erf Process.GetProcessById tout simplement...

Du coup ca me mélange du .NET et de l'API Windows, il doit bien y'avoir moyen de tout faire via l'API Windows, m'enfin l'essentiel c'est que ça marche.