为什么我不能以 MDI 方式打开外部应用程序?
Why can't I open an external application as MDI?
当我打开一个外部应用程序作为 MDI 子应用程序时,该应用程序打开,但不是作为 MDI 子应用程序。我有一个 class 可以正确运行 notepad.exe,但它不适用于我自己的应用程序:
public class ExternalApp {
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
private static extern uint SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
public static void LoadProcessInControl(string app_path, Control parent) {
System.Diagnostics.Process p = System.Diagnostics.Process.Start(app_path);
p.WaitForInputIdle();
ExternalApp.SetParent(p.MainWindowHandle, parent.Handle);
}
}
我用这个调用函数:
ExternalApp.LoadProcessInControl(@"C:\Users\Bálint\Documents\Visual Studio 2013\Projects\TesztApp\TesztApp.exe", this);
有什么问题?
实际上我的评论是错误的,这些属性不需要设置。有一阵子了。 :) 为此,我在子表单中使用面板取得了一些成功:
public partial class Form2 : Form
{
[DllImport("user32.dll", SetLastError = true)]
private 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);
public Form2()
{
InitializeComponent();
Process process = new Process();
process.StartInfo.FileName = "Notepad.exe";
process.Start();
process.WaitForInputIdle();
SetParent(process.MainWindowHandle, panel1.Handle);
//This maximizes the process window.
SendMessage(process.MainWindowHandle, 274, 61488, 0);
return;
}
}
SendMessage 的文档是 here。
子窗体是这样显示的,嵌入了记事本:
public Form1()
{
InitializeComponent();
Form2 newForm2 = new Form2();
newForm2.MdiParent = this;
newForm2.Show();
}
当我打开一个外部应用程序作为 MDI 子应用程序时,该应用程序打开,但不是作为 MDI 子应用程序。我有一个 class 可以正确运行 notepad.exe,但它不适用于我自己的应用程序:
public class ExternalApp {
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
private static extern uint SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
public static void LoadProcessInControl(string app_path, Control parent) {
System.Diagnostics.Process p = System.Diagnostics.Process.Start(app_path);
p.WaitForInputIdle();
ExternalApp.SetParent(p.MainWindowHandle, parent.Handle);
}
}
我用这个调用函数:
ExternalApp.LoadProcessInControl(@"C:\Users\Bálint\Documents\Visual Studio 2013\Projects\TesztApp\TesztApp.exe", this);
有什么问题?
实际上我的评论是错误的,这些属性不需要设置。有一阵子了。 :) 为此,我在子表单中使用面板取得了一些成功:
public partial class Form2 : Form
{
[DllImport("user32.dll", SetLastError = true)]
private 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);
public Form2()
{
InitializeComponent();
Process process = new Process();
process.StartInfo.FileName = "Notepad.exe";
process.Start();
process.WaitForInputIdle();
SetParent(process.MainWindowHandle, panel1.Handle);
//This maximizes the process window.
SendMessage(process.MainWindowHandle, 274, 61488, 0);
return;
}
}
SendMessage 的文档是 here。 子窗体是这样显示的,嵌入了记事本:
public Form1()
{
InitializeComponent();
Form2 newForm2 = new Form2();
newForm2.MdiParent = this;
newForm2.Show();
}