En mi aplicación WPF, alojo contenido Win32 utilizando HwndHost. Sin embargo, la creación de HwndHost no crea la ventana nativa. Por el contrario, esto se hace en el método BuildWindowCore()
reemplazado que WPF llama en algún momento más adelante.Forzar la inicialización de HwndHost
Mi contenido alojado necesita el identificador de ventana de la ventana nativa para su propia inicialización. Desafortunadamente, no hay forma de forzar la creación de la ventana (es decir, hacer que WPF llame a BuildWindowCore), así que tengo un segundo hilo que sondea HwndHost hasta que se haya inicializado.
En .NET 4.0/WPF 4.0, se agregó un nuevo método WindowInteropHelper.EnsureHandle()
. Esperaba que esto resolviera la situación, pero solo funciona para una ventana, no para un HwndHost (que no se deriva de Window). ¿Tienes alguna sugerencia de qué podría hacer?
EDIT:
me olvidó añadir algunos más restricciones para una posible solución:
- El HwndHost se coloca en un control que, dependiendo de la configuración del usuario, puede ser un hijo de la aplicación del principal ventana o se puede colocar en una nueva ventana (a través de un administrador de acoplamiento de terceros). Esto significa que durante la creación de la ventana no sé con certeza cuál será la ventana primaria (y por lo tanto su hWnd).
- Mientras que el código nativo necesita el hWnd durante su inicialización, la ventana solo se muestra cuando el usuario solicita que se muestre (es decir, es invisible al principio). Se debe evitar mostrar la ventana, solo para ocultarla inmediatamente nuevamente, si es posible.
Hay dos problemas: 1) No conozco el padre hWnd, ya que el control es luego posicionado por un administrador de acoplamiento de terceros, y la configuración de usuario almacenada determina si se muestra solo o como un " niño "de la ventana principal. 2) Es posible que el control con HwndHost no se muestre en absoluto inicialmente (dependiendo de nuevo de la configuración de usuario almacenada), pero al inicio, el código heredado necesita el hWnd. –
Debería poder enganchar en el evento Loaded en su control y hacer toda la inicialización allí: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.loaded.aspx. Si el código heredado necesita el hwnd, entonces solo necesita dejar de hacer algo con el código heredado hasta que el hwnd esté listo (que es lo que tenía que hacer). –
Cita del enlace: "Se produce cuando el elemento se presenta, se procesa y está listo para la interacción". Si no muestro el control, Loaded no se disparará. –