C# 在窗体面板中打开其他程序
C# open other program in form panel
你好,我是韩国的初级开发者。
我正在制作。程序。程序在一个窗体上运行三个exe(c++、c#开发),把程序放到面板中。
现在我把C++或者其他语言的程序放到面板里了。但是,windows用C#构建的程序不保留在面板上。
这是我的部分代码:
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
static extern bool MoveWindow(IntPtr Handle, int x, int y, int w, int h, bool repaint);
static readonly int GWL_STYLE = -16;
static readonly int WS_VISIBLE = 0x10000000;
private void Form1_Load(object sender, EventArgs e)
{
try
{
Process p = Process.Start("C:\Users\sonmi\OneDrive\Japan_Bunge_alpha\Japan_Bunge_alpha\bin\Debug\Japan_Bunge_alpha"); //C# program
Process p2 = Process.Start("C:\Users\sonmi\Desktop\astana_test\astana\Server\Server_CES"); //C++ program
p.WaitForInputIdle();
Thread.Sleep(100);
SetParent(p.MainWindowHandle, this.Handle);
SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
MoveWindow(p.MainWindowHandle, 0, 0, panel1.Width, panel1.Height, true);
p2.WaitForInputIdle();
SetParent(p2.MainWindowHandle, panel2.Handle);
SetWindowLong(p2.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
MoveWindow(p2.MainWindowHandle, 0, 0, panel2.Width, panel2.Height, true);
}
我现在已经使用了两个面板,但是在这个测试结束后我会添加更多。
不知道问题出在哪里
对于C#应用程序,您可以将应用程序加载到当前的AppDomain中,并将其视为一个库。为此,将其添加到您的项目参考中。如何初始化并将其放入面板取决于引用的应用程序的设计方式。
您可能必须自己初始化该应用程序的主窗体并以此方式设置父窗体。
Thread.Sleep(100);
SetParent(p.MainWindowHandle, this.Handle); <-- panel1.Handle
SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
你好,我是韩国的初级开发者。
我正在制作。程序。程序在一个窗体上运行三个exe(c++、c#开发),把程序放到面板中。
现在我把C++或者其他语言的程序放到面板里了。但是,windows用C#构建的程序不保留在面板上。 这是我的部分代码:
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
static extern bool MoveWindow(IntPtr Handle, int x, int y, int w, int h, bool repaint);
static readonly int GWL_STYLE = -16;
static readonly int WS_VISIBLE = 0x10000000;
private void Form1_Load(object sender, EventArgs e)
{
try
{
Process p = Process.Start("C:\Users\sonmi\OneDrive\Japan_Bunge_alpha\Japan_Bunge_alpha\bin\Debug\Japan_Bunge_alpha"); //C# program
Process p2 = Process.Start("C:\Users\sonmi\Desktop\astana_test\astana\Server\Server_CES"); //C++ program
p.WaitForInputIdle();
Thread.Sleep(100);
SetParent(p.MainWindowHandle, this.Handle);
SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
MoveWindow(p.MainWindowHandle, 0, 0, panel1.Width, panel1.Height, true);
p2.WaitForInputIdle();
SetParent(p2.MainWindowHandle, panel2.Handle);
SetWindowLong(p2.MainWindowHandle, GWL_STYLE, WS_VISIBLE);
MoveWindow(p2.MainWindowHandle, 0, 0, panel2.Width, panel2.Height, true);
}
我现在已经使用了两个面板,但是在这个测试结束后我会添加更多。 不知道问题出在哪里
对于C#应用程序,您可以将应用程序加载到当前的AppDomain中,并将其视为一个库。为此,将其添加到您的项目参考中。如何初始化并将其放入面板取决于引用的应用程序的设计方式。
您可能必须自己初始化该应用程序的主窗体并以此方式设置父窗体。
Thread.Sleep(100);
SetParent(p.MainWindowHandle, this.Handle); <-- panel1.Handle
SetWindowLong(p.MainWindowHandle, GWL_STYLE, WS_VISIBLE);