Question

Je suis en train de construire une application qui collecte les informations relatives à l'état de la fenêtre avec une autre application, mainWindowhandle. Je n'ai aucun problème à collecter des informations sur les fenêtres enfants, mais je ne peux pas accéder aux autres fenêtres ouvertes d'une application ni même aux menus. Existe-t-il un moyen d'obtenir tous les descripteurs de fenêtre d'une application?

Était-ce utile?

La solution

Vous pouvez faire ce que Process.MainWindowHandle semble faire: utilisez P / Invoke pour appeler le EnumWindows , qui appelle une méthode de rappel pour chaque fenêtre de niveau supérieur du système.

Dans votre rappel, appelez GetWindowThreadProcessId , et comparez l'ID de processus de la fenêtre avec Process.Id ; si les identifiants de processus correspondent, ajoutez le descripteur de fenêtre à une liste.

Autres conseils

Tout d'abord, vous devez obtenir le handle de fenêtre de la fenêtre principale de l'application.

 [DllImport("user32.dll", SetLastError = true)]
 static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

 IntPtr hWnd = (IntPtr)FindWindow(windowName, null);

Ensuite, vous pouvez utiliser cette poignée pour obtenir toutes les fenêtres enfants:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);

private List<IntPtr> GetChildWindows(IntPtr parent)  
{  
    List<IntPtr> result = new List<IntPtr>();  
    GCHandle listHandle = GCHandle.Alloc(result);  
    try  
    {  
         EnumWindowProc childProc = new EnumWindowProc(EnumWindow);  
         EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));  
    }  
    finally  
    {  
         if (listHandle.IsAllocated)  
               listHandle.Free();  
    }  
    return result;  
}   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top