C# WinForms 中嵌入 EXE 程序 打开外部的exe程序

 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");

 

posted @ 2024-10-11 09:32  LuoCore  阅读(103)  评论(0编辑  收藏  举报