Я сделал это некоторое время назад для 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 родительского объекта.