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