プログラムを MDI 子ウィンドウとして使用する方法はありますか。複数の子ウィンドウを持つことができるメインの MDI 親ウィンドウを 1 つ持つことを考えています。そのうちのいくつかは、独自のプログラム (.exe ファイル) になります。
ティム
実は、これを行うにはかなり簡単な方法があります。
まず、フォームにパネルを追加する必要があります。このパネルは、アプリケーションを「ホスト」するために使用されます。
次に、"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);
InteropServices
とThreading
名前空間をインポートする
using System.Runtime.InteropServices;
using System.Threading;
インポートSetParent
元user32.dll
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr child,IntPtr parent);
新しいプロセスを作成し、それをフォームの MDI 子にします。SetParent
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);
私は数年前に同様のものを実装しました (私の記憶が正しければ、.NET Framework 1.1 ベースです)。その実装の重要な要素は次のとおりです。
Form
UI を呼び出すユーザー コマンドを抽出するためのインターフェイスなど、いくつかの特定の機能を公開する拡張クラスを作成しました。Activator.CreateInstance
)、フォームの境界線から取り除かれ、コンテナーに埋め込まれます (この場合は aTabPage
内の aTabControl
であり、あなたの場合は「空の」MDI 子である可能性が最も高いです)。アプリケーションのフォーム)。これはすべてかなりうまくいったと思います(実際、フレームワークはまだ維持されており、それが作成された会社内で使用されていると思います)。
メモリ管理に注意したい場合があります。たとえば、アセンブリはアンロードできないため、それが必要な場合は、外部アセンブリを別の AppDomains にロードする必要があります。また、子ウィンドウの UI が読み込まれるときに動的にアタッチされるイベント ハンドラーにも注意を払い、UI がアンロードされるときにイベント ハンドラーが適切に切り離されるようにします。