Я пытаюсь запустить другое приложение из приложения C#, есть ли способ отобразить это приложение внутри основной формы моего приложения?Запуск другого приложения с C#
Спасибо,
Я пытаюсь запустить другое приложение из приложения C#, есть ли способ отобразить это приложение внутри основной формы моего приложения?Запуск другого приложения с C#
Спасибо,
Вы можете запускать другие приложения с помощью Process.Start(...):
Process.Start(@"C:\Path\OtherApp.exe");
Чтобы встроить приложение в вашу форму, проверить это являться CodeProject article that demos a technique for hosting other application's windows в вашей форме.
Он просит о включении в него другого приложения. – Oded
@Oded: Это ссылка на статью CodeProject. Я отредактирую, чтобы сделать это более ясным. –
В общем, практически невозможно отобразить на вашем устройстве какое-либо стороннее приложение. Если целевое приложение поддерживает интерфейс консоли, я бы создал свой собственный интерфейс для этого приложения, которое будет транслировать команды GUI для консольных команд целевого приложения.
Вы можете попробовать сделать это через reparenting. См. Мой пост в MSDN, где я описываю это для WPF: Composite "shell" application.
Техника сама по себе будет такой же для WinForms. У вас есть хост-область в вашем приложении. Измените стиль окна верхнего уровня целевого приложения на WS_CHILD. Вызовите SetParent(), изменив родителя целевого окна на вашу область хоста.
Обратите внимание, что в Win32 только в окне верхнего уровня есть меню. Таким образом, переход на WS_CHILD удаляет меню.
Вы можете сделать это таким образом:
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
[DllImport("user32.dll", SetLastError = true)]
static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
[DllImport("user32.dll")]
static extern IntPtr SetActiveWindow(IntPtr hWnd);
private const int GWL_STYLE = (-16);
private const int WS_VISIBLE = 0x10000000;
private const int WS_MAXIMIZE = 0x01000000;
private void Form1_Load(object sender, EventArgs e)
{
this.SuspendLayout();
Process notepad = new Process();
ProcessStartInfo psi = new ProcessStartInfo("notepad.exe");
psi.WindowStyle = ProcessWindowStyle.Normal;
notepad.StartInfo = psi;
notepad.Start();
this.ResumeLayout();
notepad.WaitForInputIdle(3000);
IntPtr old = SetParent(notepad.MainWindowHandle, this.Handle);
SetWindowLong(notepad.MainWindowHandle, GWL_STYLE, WS_VISIBLE + WS_MAXIMIZE);
MoveWindow(notepad.MainWindowHandle, 100, 100, 400, 400, true);
SetActiveWindow(notepad.MainWindowHandle);
SwitchToThisWindow(notepad.MainWindowHandle, true); }
В этом случае у вас есть Notepad приложение в вашей форме;)
Это зависит от приложения, которое вы хотите запустить. Позволяет ли он быть создан как объект ActiveX (например, Word или Internet Explorer)? –