Как запустить приложение внутри приложения wpf?

У меня вопрос, как запустить приложение (.exe) внутри приложения WPF. Я имею в виду запуск внутри окна приложения, а не внешний запуск приложения.

Заранее спасибо

1 ответ

То, что вы хотите сделать, вполне возможно, но в нем есть несколько ошибок, так что не ждите легкой поездки. Что вам нужно сделать, это создать класс, который наследует от HwndHost и переопределяет BuildWindowCore() метод. См. Пример от Microsoft по http://msdn.microsoft.com/en-us/library/ms752055.aspx

В приведенном выше примере они дают вам представление о возможности поместить элемент управления Win32 в вашу форму WPF, но вы можете использовать ту же архитектуру для загрузки MainWindowhandle созданного вами процесса "Блокнот" в дочерний элемент границы. Как это:

protected override HandleRef BuildWindowCore(HandleRef hwndParent)
    {
        ProcessStartInfo psi = new ProcessStartInfo("notepad.exe");
        psi.WindowStyle = ProcessWindowStyle.Minimized;
        _process = Process.Start(psi);
        _process.WaitForInputIdle();

        // The main window handle may be unavailable for a while, just wait for it
        while (_process.MainWindowHandle == IntPtr.Zero)
        {
            Thread.Yield();
        }

        IntPtr notepadHandle = _process.MainWindowHandle;

        int style = GetWindowLong(notepadHandle, GWL_STYLE);
        style = style & ~((int)WS_CAPTION) & ~((int)WS_THICKFRAME); // Removes Caption bar and the sizing border
        style |= ((int)WS_CHILD); // Must be a child window to be hosted

        SetWindowLong(notepadHandle, GWL_STYLE, style);
        SetParent(notepadHandle, hwndParent.Handle);

        this.InvalidateVisual();

        HandleRef hwnd = new HandleRef(this, notepadHandle);
        return hwnd;
    }

Помните, что вам нужно будет импортировать несколько функций из User32.dll, чтобы иметь возможность установить стиль окна и дескриптор родительского окна:

[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("user32")]
private static extern IntPtr SetParent(IntPtr hWnd, IntPtr hWndParent);

Также убедитесь, что вы включаете:

using System.Windows.Interop;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

Это мой первый ответ на форуме, поэтому, пожалуйста, дайте мне знать, если это нужно поработать. Также обратите внимание на размещение внешнего приложения в окне WPF, но не беспокойтесь о DwayneNeed. Просто используйте SetParent(), как вы видите в моем коде выше. Просто будьте осторожны, если вы попытаетесь встроить приложение в закладку. Там вы встретите веселье.

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