Как встраивать Window из другого приложения в наше окно WPF в качестве пользовательского элемента управления?

Возможно ли иметь окно из другого стороннего приложения, показанного внутри нашего окна WPF? Предпочтительно в режиме управления контейнером?

Я предполагаю, что может быть некоторый Win32 API, который позволяет нам это делать.

Ответ 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 родителя.