0

次の方法を使用して、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 フォームで子フォームを開く方法です。

4

1 に答える 1

0
// Create a new process
Process proc;

// Start the process
proc = Process.Start(Application.StartupPath + @"\App2.exe");
proc.WaitForInputIdle();

// Add this by using using System.Threading;
Thread.Sleep(500);

// Set the panel control as the application's parent
SetParent(proc.MainWindowHandle, this.panel1.Handle);
于 2014-06-14T20:06:04.737 に答える