Ответ 1
Я сделал это некоторое время назад для Winforms, но метод не был ярким, так что, пока кто-либо еще не имеет ни малейшего представления, вот что я сделал. Код был примерно таким:
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);
(где SetParent, SetWindowLong и MoveWindow - это функции win32 API, вызванные с помощью p/invoke). Сон необходим как взломать, потому что без него вызов MoveWindow не будет иметь эффекта.
Для WPF вам понадобится дескриптор окна/элемента управления, который будет являться партией вашего стороннего окна, и самый простой способ получить такой дескриптор - использовать HwndHost.
Я не думаю, что в WPF есть более красивый способ добиться этого. Кроме того, обратите внимание, что я тестировал это только в winforms, а не в WPF, но он должен работать и в WPF, если у него есть допустимый win32 HWND родителя.