У меня есть приложение WPF, которое должно выглядеть так, как будто оно размещено внутри другого приложения, не относящегося к WPF. В реальной жизни это приложение, отличное от WPF, представляет собой ActiveX внутри Internet Explorer, но для иллюстрации проблемы я использую простое приложение Windows Forms.
Я использую функцию Windows API SetParent, в которой уже есть десятки потоков. Однако я не могу найти ничего, что написано о моей конкретной проблеме: Небольшая область справа и внизу приложения WPF не отображается внутри окна приложения, отличного от WPF .
Окно WPF работает само по себе :
Окно WPF с окном приложения WinForm в качестве родителя:
Я не испытываю проблемы, если поменять местами приложение WPF на приложение WinForms или обычное приложение Win32 (например, Блокнот).
Код WinForm выглядит так:
private void Form1_Load(object sender, EventArgs e)
{
// Start process
var psi = new ProcessStartInfo("c:\\wpfapp\\wpfapp\\bin\\Debug\\wpfapp.exe");
psi.WindowStyle = ProcessWindowStyle.Normal;
_process = Process.Start(psi);
// Sleep until new process is ready
Thread.Sleep(1000);
// Set new process's parent to this window
SetParent(_process.MainWindowHandle, this.Handle);
// Remove WS_POPUP and add WS_CHILD window style to child window
const int GWL_STYLE = -16;
const long WS_POPUP = 0x80000000;
const long WS_CHILD = 0x40000000;
long style = GetWindowLong(_process.MainWindowHandle, GWL_STYLE);
style = (style & ~(WS_POPUP)) | WS_CHILD;
SetWindowLong(_process.MainWindowHandle, GWL_STYLE, style);
// Move and resize child window to fit into parent's
MoveWindow(_process.MainWindowHandle, 0, 0, this.Width, this.Height, true);
}
Примечание: я ' Я знаю, что использование SetParent не обязательно является рекомендуемой практикой, но я хочу и мне нужно узнать, как это сделать, поэтому позвольте мне:)