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

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

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

1 Ответ

9 голосов
/ 05 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...