请问C#如何添加子进程并在任务管理中有显示,参考Edge的多进程例子:
这里这个Edge应用下有多个子进程,请问如何在C#中添加类似的进程并在任务管理器中显示出来。
Winform无法实现,需要借用win api。
[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
private Process childProcess;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, System.EventArgs e)
{
// 启动一个新的子进程
childProcess = new Process();
childProcess.StartInfo.FileName = "cmd.exe";
childProcess.StartInfo.UseShellExecute = false;
childProcess.StartInfo.CreateNoWindow = true; // 不显示CMD窗口
// 启动进程
childProcess.Start();
// 等待进程启动完成
//childProcess.WaitForInputIdle();
// 将子进程附加到当前WinForms进程
SetParent(childProcess.MainWindowHandle, this.Handle);
}
有没有完整的解决方案代码?你上面那个MultiThreads(32位)就是多进程的吧???
请将解决方案代码发我邮箱,谢谢:
lzhdim@163.com
@lzhdim: 我就说你这个id怎么那么熟悉,我看过你很多篇文章!
试过SetParent
,但是是在Winform里的,能嵌入到主窗体的Panel里,但是设置父子进程无效,所以来问问。。。
@echo_lovely: ChatGPT那个打不开,哈哈。。。
@lzhdim: 嵌入到主窗体Panel里的,我问GPT了,它回复我比较麻烦,我没有做测试
@lzhdim:
这是GPT回复我的代码,它尝试将记事本附加到winform:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public partial class MainForm : Form
{
[DllImport("user32.dll")]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int Width, int Height, uint uFlags);
const int SW_SHOWNORMAL = 1;
private Process childProcess;
public MainForm()
{
InitializeComponent();
}
private void btnStartProcess_Click(object sender, EventArgs e)
{
// 启动一个新的子进程
childProcess = new Process();
childProcess.StartInfo.FileName = "notepad.exe";
childProcess.StartInfo.UseShellExecute = true; // 使用Shell执行
childProcess.StartInfo.CreateNoWindow = false; // 显示Notepad窗口
// 启动进程
childProcess.Start();
// 等待Notepad进程启动完成并获取窗口句柄
childProcess.WaitForInputIdle(); // 这里需要等待Notepad进程准备好
// 获取Notepad的主窗口句柄
IntPtr notepadHandle = childProcess.MainWindowHandle;
// 设置父窗口
SetParent(notepadHandle, this.Handle);
// 将Notepad窗口大小调整以适应父窗口
SetWindowPos(notepadHandle, IntPtr.Zero, 0, 0, this.Width, this.Height, 0);
// 显示Notepad窗口
ShowWindow(notepadHandle, SW_SHOWNORMAL);
}
}
我记得楼主你搞过很多这种windows api的项目啊,应该比较熟悉,我班门弄斧了