Как встроить 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 родительского объекта.

Другие вопросы по тегам