在C#中,如果你想要从一个exe程序中启动另一个exe程序,并希望在需要时能够关闭它。
一、启动外部exe程序:
使用System.Diagnostics.Process启动程序,代码如下:
private void btnStart_Click(object sender, RoutedEventArgs e)
{FileInfo exePath = new FileInfo(Common.GetRunPath());//获取程序启动路径string path = System.IO.Path.Combine(exePath.Directory.FullName, "Other", "OtherEXE.exe");try{using (System.Diagnostics.Process baa = System.Diagnostics.Process.Start(path)){baa.WaitForInputIdle(500);}}catch (Exception ex){}
}
二、关闭外部exe程序:
在C#中,如果你通过Process类启动了另一个exe程序,你可以调用Process类的CloseMainWindow或者Kill方法来关闭它:
-
CloseMainWindow()方法: 这个方法会发送一个关闭消息到主窗口,模拟用户点击窗口关闭按钮的行为。如果该进程只运行了一个主线程且没有处理这个关闭消息,那么整个进程将会结束。但如果被启动的应用程序有后台线程或其他未完成的任务,可能无法完全关闭。
-
Kill()方法: 这个方法会强制终止进程及其所有子线程,无论它们是否正在执行重要任务。这是最直接但也是最粗暴的方法,可能会导致数据丢失或者其他未预期的问题。
建议首先尝试使用CloseMainWindow方法,如果无法正常关闭再考虑使用Kill方法。
Process process = new Process();
// 设置启动信息(例如文件路径等)
process.Start();// ... 在适当的时候关闭进程
process.CloseMainWindow();
if (!process.HasExited)
{// 如果CloseMainWindow未能关闭进程,则强制结束process.Kill();
}
或是使用Process.GetProcesses() 是一个静态方法,它返回当前系统中所有正在运行的进程的一个数组。然后匹配进程名称,使用Kill()方法:
private void btnClose_Click(object sender, RoutedEventArgs e)
{Process[] process = Process.GetProcesses();foreach (Process prc in process){if (prc.ProcessName == "OtherEXE")prc.Kill();}
}
注意的是,关闭一个外部进程可能会影响到运行中的数据和资源,因此请谨慎使用Kill
方法,并尽量确保外部exe程序能够正常处理关闭事件。
或是直接在进程中查找进程名,直接使用。
// 启动新的进程
Process processToStart = new Process();
processToStart.StartInfo.FileName = "path_to_your_exe";
processToStart.Start();// ... 在适当的时候关闭进程
// 假设你知道启动的exe的名称(这里是"YourExeName.exe")
Process[] processes = Process.GetProcessesByName("YourExeName.exe");
if (processes.Length > 0)
{// 关闭主窗口(如果有)processes[0].CloseMainWindow();// 等待一段时间看是否已退出processes[0].WaitForExit(5000); // 等待5秒if (!processes[0].HasExited){// 如果仍未退出,则强制结束processes[0].Kill();}
}