Nella mia applicazione WPF, il contenuto Win32 viene ospitato tramite HwndHost. Tuttavia, la creazione di un HwndHost non crea la finestra nativa. Piuttosto, questo viene fatto nel metodo BuildWindowCore()
sovrascritto che viene chiamato qualche tempo dopo da WPF.Forzare l'inizializzazione di un HwndHost
mio contenuti ospitati bisogno del handle di finestra della finestra nativa per la propria inizializzazione. Sfortunatamente, non è possibile forzare la creazione della finestra (cioè avendo WPF chiamare BuildWindowCore), quindi ho un secondo thread che esegue il polling di HwndHost fino a quando non è stato inizializzato.
In .NET 4.0/WPF 4.0, è stato aggiunto un nuovo metodo WindowInteropHelper.EnsureHandle()
. Speravo che questo avrebbe risolto la situazione, ma funziona solo per una finestra, non un HwndHost (che non deriva da Window). Hai un suggerimento cosa potrei fare invece?
EDIT:
ho dimenticato di aggiungere un po 'più vincoli per una possibile soluzione:
- Il HwndHost è posto in un controllo che, a seconda delle impostazioni utente, può essere un figlio della richiesta del principale finestra o può essere inserito in una nuova finestra (tramite un gestore di attracco di terze parti). Ciò significa che durante la creazione della finestra non so per certo quale sarà la finestra padre (e quindi la sua hWnd).
- Mentre il codice nativo necessita di hWnd durante l'inizializzazione, la finestra viene visualizzata solo quando l'utente richiede di visualizzarla (ad esempio, all'inizio è invisibile). Se è necessario mostrare la finestra, solo per nasconderlo immediatamente di nuovo, dovrebbe essere evitato.
Esistono due problemi: 1) Non conosco il padre hWnd, poiché il controllo viene successivamente posizionato da un gestore di attracco di terze parti e le impostazioni utente memorizzate determinano se viene visualizzato da solo o come " figlio "della finestra principale. 2) Il controllo con HwndHost potrebbe non essere mostrato inizialmente (a seconda delle impostazioni dell'utente memorizzato), ma all'avvio il codice legacy necessita di hWnd. –
Dovresti essere in grado di collegarti all'evento Loaded sul tuo controllo e fare tutto l'inizializzazione lì: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.loaded.aspx. Se il codice legacy ha bisogno dell'hwnd, allora devi solo continuare a fare qualsiasi cosa con il codice legacy fino a quando hwnd è pronto (che è quello che dovevo fare). –
Citazione dal link: "Si verifica quando l'elemento è disposto, reso e pronto per l'interazione." Se non mostro il controllo, Loaded non sparerà. –