public class ProcessEmbedder { // 常量定义 private const int GWL_STYLE = -16; // 窗口样式 private const int WS_VISIBLE = 0x10000000; // 可见窗口样式 // 导入user32.dll中的SetParent函数,用于设置窗口的父窗口 [DllImport("user32.dll", EntryPoint = "SetParent")] private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); // 导入user32.dll中的ShowWindow函数,用于显示窗口 [DllImport("user32.dll", EntryPoint = "ShowWindow")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); // 导入user32.dll中的MoveWindow函数,用于移动和调整窗口大小 [DllImport("user32.dll", SetLastError = true)] private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); // 存储嵌入的进程 private static Process embeddedProcess; /// <summary> /// 嵌入指定路径的进程窗口到当前的Panel控件中 /// </summary> /// <param name="processPath">需要嵌入的进程的可执行文件路径</param> public void EmbedProcess(Form frm, string processPath) { // 创建进程启动信息,并设置相关属性 ProcessStartInfo startInfo = new ProcessStartInfo(processPath) { UseShellExecute = false, // 不使用操作外壳来启动 CreateNoWindow = true // 不创建新窗口 }; // 启动进程并保存引用 embeddedProcess = Process.Start(startInfo); // 等待进程创建窗口 embeddedProcess.WaitForInputIdle(); // 获取子窗口句柄 IntPtr childHandle = embeddedProcess.MainWindowHandle; // 将子窗口的父窗口设置为当前的Form控件 SetParent(childHandle, frm.Handle); // 显示子窗口 ShowWindow(childHandle, 1); // 1代表SW_SHOWNORMAL // 移动并调整子窗口的大小,以填充当前的Form控件 MoveWindow(childHandle, 0, 0, frm.Width, frm.Height, true); } /// <summary> /// 关闭嵌入的进程 /// </summary> public void CloseEmbeddedProcess() { if (embeddedProcess != null && !embeddedProcess.HasExited) { embeddedProcess.Kill(); // 终止进程 } } }
打开计算器
new Commons.ProcessEmbedder().EmbedProcess(this,"calc.exe");
标签:IntPtr,embeddedProcess,EXE,窗口,C#,程序,dll,int,user32 From: https://www.cnblogs.com/LuoCore/p/18457742