2010-04-22 5 views
3

Я пытаюсь запустить другое приложение из приложения C#, есть ли способ отобразить это приложение внутри основной формы моего приложения?Запуск другого приложения с C#

Спасибо,

+1

Это зависит от приложения, которое вы хотите запустить. Позволяет ли он быть создан как объект ActiveX (например, Word или Internet Explorer)? –

ответ

6

Вы можете запускать другие приложения с помощью Process.Start(...):

Process.Start(@"C:\Path\OtherApp.exe"); 

Чтобы встроить приложение в вашу форму, проверить это являться CodeProject article that demos a technique for hosting other application's windows в вашей форме.

+1

Он просит о включении в него другого приложения. – Oded

+0

@Oded: Это ссылка на статью CodeProject. Я отредактирую, чтобы сделать это более ясным. –

0

В общем, практически невозможно отобразить на вашем устройстве какое-либо стороннее приложение. Если целевое приложение поддерживает интерфейс консоли, я бы создал свой собственный интерфейс для этого приложения, которое будет транслировать команды GUI для консольных команд целевого приложения.

1

Вы можете попробовать сделать это через reparenting. См. Мой пост в MSDN, где я описываю это для WPF: Composite "shell" application.

Техника сама по себе будет такой же для WinForms. У вас есть хост-область в вашем приложении. Измените стиль окна верхнего уровня целевого приложения на WS_CHILD. Вызовите SetParent(), изменив родителя целевого окна на вашу область хоста.

Обратите внимание, что в Win32 только в окне верхнего уровня есть меню. Таким образом, переход на WS_CHILD удаляет меню.

1

Вы можете сделать это таким образом:

[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 приложение в вашей форме;)

Смежные вопросы