Программы как MDI Child windows - PullRequest
1 голос
/ 04 октября 2009

Есть ли способ использовать программу в качестве дочернего окна MDI. Я имею в виду наличие одного основного родительского окна MDI, которое может иметь несколько дочерних окон, некоторые из которых будут собственно программами (.exe-файлами).

Тим

Ответы [ 3 ]

4 голосов
/ 04 октября 2009

Существует довольно простой способ сделать это.

Во-первых, вам нужно добавить панель в форму. Эта панель будет использоваться для «размещения» приложения.

Далее вам нужно пространство имен System.Runtime.InteropServices и System.Diagnostics для ваших пространств имен: CSharp

using System.Diagnostics;
using System.Runtime.InteropServices;

Теперь нам нужно настроить наши функции WinAPI:

[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hwndChild, IntPtr hwndNewParent);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, Int32 lParam);

Теперь внутри события нажатия кнопки запустите процесс и установите его родительский элемент для панели. В этом примере я буду использовать блокнот:

// Create a new process
Process proc;

// Start the process
proc = Process.Start("notepad.exe");
proc.WaitForInputIdle();

// Set the panel control as the application's parent
SetParent(proc.MainWindowHandle, this.panel1.Handle);

// Maximize application
SendMessage(proc.MainWindowHandle, 274, 61488, 0);
0 голосов
/ 15 июня 2014
 // using
using System.Runtime.InteropServices;<br>
using System.Threading;

// в коде класса

 [DllImport("user32.dll")]<br>
    static extern IntPtr SetParent(IntPtr child,IntPtr parent);

// Создать новый процесс

 Process proc;

// Start the process
proc = Process.Start("calc.exe");

proc.WaitForInputIdle();
Thread.Sleep(500);

// Set the panel control as the application's parent
SetParent(proc.MainWindowHandle, this.panel1.Handle);
0 голосов
/ 04 октября 2009

Я реализовал похожую вещь несколько лет назад (на основе .NET Framework 1.1, если я правильно помню). Ключевые элементы этой реализации:

  • Мы создали расширенный класс Form, который предоставляет некоторые специфические функции, такие как интерфейс для извлечения пользовательских команд, которые будут вызывать пользовательский интерфейс.
  • Основное приложение будет сканировать библиотеки DLL в каталоге приложения и проверять их (используя Reflection ), чтобы найти любые классы на основе нашего специального класса Form, и извлекать из них информацию для создания структур меню, которые вызвать команды.
  • Когда пользователь вызывал команду, которая привела бы к отображению формы, она была создана (используя Activator.CreateInstance), отделена от границ формы и встроена в контейнер (в нашем случае TabPage в TabControl, в вашем случае, скорее всего, это «пустая» форма MDI Child в вашем приложении).

Я думаю, что все сработало довольно хорошо (на самом деле я думаю, что фреймворк все еще поддерживается и используется в компании, для которой он был создан).

Возможно, вы захотите следить за управлением памятью. Например, поскольку сборка не может быть выгружена, если это требование, вам нужно будет загрузить внешние сборки в отдельные домены приложений. Также обратите внимание на любые обработчики событий, которые подключаются динамически при загрузке дочерних оконных интерфейсов, чтобы они правильно отсоединялись при выгрузке пользовательского интерфейса.

...