Obtenir les poignées de fenêtre de l'application
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?
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;
}