Lister toutes les top-level windows d'un processus

Résolu
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 - 7 déc. 2008 à 18:34
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 - 8 déc. 2008 à 02:42
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 déc. 2008 à 01:09
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;
}
3
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
7 déc. 2008 à 21:21
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...
0
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
8 déc. 2008 à 00:24
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...
0
bubbathemaster Messages postés 339 Date d'inscription dimanche 26 janvier 2003 Statut Membre Dernière intervention 25 mars 2009 4
8 déc. 2008 à 02:42
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.
0
Rejoignez-nous