1

プログラムを MDI 子ウィンドウとして使用する方法はありますか。複数の子ウィンドウを持つことができるメインの MDI 親ウィンドウを 1 つ持つことを考えています。そのうちのいくつかは、独自のプログラム (.exe ファイル) になります。

ティム

4

3 に答える 3

4

実は、これを行うにはかなり簡単な方法があります。

まず、フォームにパネルを追加する必要があります。このパネルは、アプリケーションを「ホスト」するために使用されます。

次に、"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);
于 2009-10-03T21:26:55.343 に答える
0

InteropServicesThreading名前空間をインポートする

using System.Runtime.InteropServices;
using System.Threading;

インポートSetParentuser32.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);
于 2014-06-14T20:20:42.873 に答える
0

私は数年前に同様のものを実装しました (私の記憶が正しければ、.NET Framework 1.1 ベースです)。その実装の重要な要素は次のとおりです。

  • FormUI を呼び出すユーザー コマンドを抽出するためのインターフェイスなど、いくつかの特定の機能を公開する拡張クラスを作成しました。
  • メイン アプリケーションは、アプリケーション ディレクトリ内の dll をスキャンし、( Reflectionを使用して) それらを調べて、特別な Form クラスに基づくクラスを見つけ、それらから情報を抽出して、コマンドを呼び出すメニュー構造を構築します。
  • ユーザーがフォームを表示するコマンドを呼び出すと、フォームが作成され ( を使用Activator.CreateInstance)、フォームの境界線から取り除かれ、コンテナーに埋め込まれます (この場合は aTabPage内の aTabControlであり、あなたの場合は「空の」MDI 子である可能性が最も高いです)。アプリケーションのフォーム)。

これはすべてかなりうまくいったと思います(実際、フレームワークはまだ維持されており、それが作成された会社内で使用されていると思います)。

メモリ管理に注意したい場合があります。たとえば、アセンブリはアンロードできないため、それが必要な場合は、外部アセンブリを別の AppDomains にロードする必要があります。また、子ウィンドウの UI が読み込まれるときに動的にアタッチされるイベント ハンドラーにも注意を払い、UI がアンロードされるときにイベント ハンドラーが適切に切り離されるようにします。

于 2009-10-03T21:06:49.297 に答える