2011-01-05 16 views

risposta

8

L'ho fatto un po 'di tempo fa per Winforms, ma il metodo non era brillante, quindi fino a quando nessun altro non ha alcuna idea, ecco cosa ho fatto. Il codice era praticamente questa:

Process p = Process.Start(@"application.exe"); 

p.WaitForInputIdle(); 
IntPtr appWin = p.MainWindowHandle; 

SetParent(appWin, parent); 
SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE); 
System.Threading.Thread.Sleep(100); 
MoveWindow(appWin, 0, 0, ClientRectangle.Width, ClientRectangle.Height, true); 

(dove SetParent, SetWindowLong e MoveWindow sono le funzioni API Win32 chiamata Via P/Invoke) Il sonno era necessario come un hack, perché senza di essa la chiamata a MoveWindow non avrebbe avuto effetto.

Per WPF è necessario un handle per una finestra/controllo che sarà il parrent della finestra di terze parti e il modo più semplice per ottenere tale handle è utilizzare un contenitore HwndHost.

Non credo che ci sia un modo più carino per ottenere questo risultato in WPF. Inoltre, si noti che l'ho provato solo in winforms, non in WPF, ma dovrebbe funzionare anche in WPF, purché abbia un HWND win32 valido del genitore.

+0

Grazie funziona ma è un po 'hacky. Il comportamento delle applicazioni di destinazione non è definito. Alcune applicazioni sono alcune delle modalità con cui il sistema operativo viene registrato come applicazione non dell'interfaccia utente anche se dispongono di un'interfaccia utente, ad esempio Office, e alcune di esse smettono di funzionare normalmente. Non accetto la tua risposta per un po 'nella speranza di ottenere più risposte se ce ne sono. –

+0

Mi stavo chiedendo al mattino come ha funzionato per te, visto che ti ho visto accettare la risposta e non lasciare commenti. Sono d'accordo che è abbastanza hacky. Sono curioso di sapere se c'è un modo migliore per farlo; sfortunatamente quando ho avuto bisogno di implementarlo ho passato così tanto tempo e non ho trovato niente di meglio di questo. A quel tempo, questo era accettabile per il mio caso, ma non è sicuramente un bel pezzo di codice e, come ho detto nella risposta, l'ho condiviso perché non c'era una risposta qui. –

+0

Grazie per aver condiviso il codice/idea. –

Problemi correlati