Pregunta

Estoy creando 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 ventanas secundarias, pero no puedo acceder a otras ventanas abiertas de una aplicación o incluso a los menús. ¿Hay alguna forma de obtener todos los manejadores de ventana de una aplicación?

¿Fue útil?

Solución

Puede hacer lo que parece Process.MainWindowHandle : usar P / Invoke para llamar a 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 a GetWindowThreadProcessId> , y compare el identificador del proceso de la ventana con Process.Id ; si los identificadores de proceso coinciden, agregue el identificador de ventana a una lista.

Otros consejos

Primero, tendrás que obtener el identificador de ventana del mainwindow de la aplicación.

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

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

Luego, puedes usar este controlador para obtener todos los 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;  
}   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top