Размещение приложения WPF внутри приложения, отличного от WPF, с использованием WIn32 SetParent ()

У меня есть приложение WPF, которое должно выглядеть так, как будто оно размещено внутри другого приложения, не относящегося к WPF. В реальной жизни это приложение, отличное от WPF, представляет собой ActiveX внутри Internet Explorer, но для иллюстрации проблемы я использую простое приложение Windows Forms.

Я использую функцию Windows API SetParent, в которой уже есть десятки потоков. Однако я не могу найти ничего, что написано о моей конкретной проблеме: Небольшая область справа и внизу приложения WPF не отображается внутри окна приложения, отличного от WPF .

Окно WPF работает само по себе :
alt text

Окно WPF с окном приложения WinForm в качестве родителя:
alt text

Я не испытываю проблемы, если поменять местами приложение 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 не обязательно является рекомендуемой практикой, но я хочу и мне нужно узнать, как это сделать, поэтому позвольте мне:)

8
задан jonsb 9 November 2010 в 16:15
поделиться