Запуск другого приложения из C # - PullRequest
3 голосов
/ 22 апреля 2010

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

Спасибо

Ответы [ 4 ]

6 голосов
/ 22 апреля 2010

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

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

Чтобы встроить приложение в вашу форму, ознакомьтесь с этой статьей CodeProject , в которой демонстрируется метод размещения окон других приложений в вашей форме.

1 голос
/ 24 июня 2010

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

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

1 голос
/ 22 апреля 2010

Вы можете попытаться сделать это через воспитание детей.См. Мой пост в MSDN, где я описываю это для WPF: Составное приложение-оболочка .

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

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

0 голосов
/ 22 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...