2009-05-04 20 views
13

Estoy construyendo una aplicación que, dada otra aplicación mainWindowhandle, recopila información sobre el estado de la ventana. No tengo problemas para recopilar información sobre las ventanas secundarias, pero no puedo acceder a las otras ventanas abiertas de una aplicación o incluso a los menús. ¿Hay alguna forma de obtener todos los identificadores de ventanas de una aplicación?Obtiene las Manillas de la ventana de la aplicación

+0

Echa un vistazo a esta solución de trabajo: http://stackoverflow.com/a/28055461/1274092 –

Respuesta

15

Puede hacer lo que parece hacer Process.MainWindowHandle: use P/Invoke para llamar a la función EnumWindows, que invoca un método de devolución de llamada para cada ventana de nivel superior en el sistema.

En su devolución de llamada, llame al GetWindowThreadProcessId, y compare el identificador de proceso de la ventana con Process.Id; si los ID de proceso coinciden, agregue el identificador de ventana a una lista.

8

En primer lugar, tendrá que obtener la ventana de la ventana principal de la aplicación.

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

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

A continuación, puede utilizar este identificador para obtener todos childwindows:

[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; 
} 
+0

Mez el problema ISN' t obtener ventanas hijas, puedo hacerlo fácilmente, lo que no puedo hacer es acceder a otras ventanas además de mainWindow y sus hijos ... – user361526

+0

Esto funciona para cualquier ventana, también para ventanas que no pertenecen a la propia aplicación. Lo siento si malinterpreté tu pregunta. – Mez

+0

¿De dónde viene 'EnumWindowProc'? –

Cuestiones relacionadas