Мой вопрос заключается в том, как запустить приложение (.exe) внутри приложения WPF. Я имею в виду запуск внутри окна приложения, а не внешний запуск приложения.
Заранее спасибо: D
Мой вопрос заключается в том, как запустить приложение (.exe) внутри приложения WPF. Я имею в виду запуск внутри окна приложения, а не внешний запуск приложения.
Заранее спасибо: D
То, что вы хотите сделать, вполне возможно, но в нем есть несколько ошибок, поэтому не ожидайте легкой езды. Вам нужно создать класс, который наследует от HwndHost
и переопределяет метод BuildWindowCore()
. См. Пример от Microsoft по адресу http://msdn.microsoft.com/en-us/library/ms752055.aspx
В приведенном выше примере они дают вам представление о возможности установки элемента управления Win32 в вашей форме WPF, но вы можете использовать ту же самую архитектуру для загрузки MainWindowhandle
вашего созданного процесса Notepad в дочерний элемент границы, Вот так:
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(), как вы видите в моем коде выше. Просто будьте осторожны, если вы попытаетесь внедрить приложение на вкладке. Там вам будет весело.