次の方法を使用して、MDI 親フォーム内で MDI 親フォームを開くことに成功しました。 MDI 親フォームをスタートアップとして持つ 2 つのデスクトップ アプリケーション (App1 と App2) を作成しました。App1 では、もう一方のアプリ、つまり App2 を開く MDI 親にパネルを追加しました。このコードを App1 に追加しました。
using System.Diagnostics; using System.Runtime.InteropServices;
と
[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);
ボタン クリック イベントでは、次のコードが使用されます。(App1)
// Create a new process
Process proc;
// Start the process
proc = Process.Start(Application.StartupPath + @"\App2.exe");
////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);
MessageBox.Show(Application.OpenForms[0].ToString());
ここで、Application.StartupPath + @"\App2.exe" は、私がビルドしたプロセスまたは EXE ファイルです (ソリューションをビルドします)。まず、ブレークポイントを使用してデバッグするとコードは正常に動作しますが、実行しようとすると、App2 は別のプロセスとして開きますが、App1 では開きません。次に、MDI 子フォーム (app2) として開かれている App2 に追加したフォームを開くことができません。
Form1 frm = new Form1();
frm.MdiParent = Application.OpenForms[0];
frm.Show();
これは、MDI フォームで子フォームを開く方法です。