为何无法等待calc.exe退出却能等待mspaint.exe?如何实现等待?
启动calc.exe无法等待进程退出的原因及解决方法
现象原因
- calc.exe并非真正的计算器应用进程,它只是个轻量启动器:在Windows 10及以上系统中,calc.exe启动后会立刻完成启动任务,唤起系统里真正的计算器核心进程(比如
Calculator.exe或UWP后台进程),随后calc.exe自己就退出了。你的代码里WaitForExit()等待的是这个启动器进程,自然会马上返回。 - mspaint.exe是独立运行的桌面应用进程,会一直运行到用户关闭窗口,所以
WaitForExit()能正确等到它退出。
实现等待计算器退出的两种方案
方案1:直接启动真正的计算器主进程
跳过calc.exe启动器,直接启动系统里的计算器主进程。Windows 10/11的UWP版计算器默认路径带版本号(会随系统更新变化),可以通过应用ID启动,代码示例:
using System.Diagnostics; var p = new Process(); // 用应用ID启动计算器 p.StartInfo.FileName = "explorer.exe"; p.StartInfo.Arguments = "shell:AppsFolder\\Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"; p.Start(); // 查找并等待Calculator.exe进程退出 foreach (var proc in Process.GetProcessesByName("Calculator")) { proc.WaitForExit(); } Console.WriteLine("Press any key to terminate this app!"); Console.ReadKey();
方案2:跟踪calc.exe启动的子进程
先等calc.exe启动器退出,再找到它启动的子进程(真正的计算器进程)并等待其退出。代码示例:
using System.Diagnostics; using System.Management; var p = new Process(); p.StartInfo.FileName = "calc.exe"; p.Start(); int parentProcId = p.Id; p.WaitForExit(); // 等待启动器进程退出 // 查询calc.exe的子进程 using (var searcher = new ManagementObjectSearcher( $"SELECT * FROM Win32_Process WHERE ParentProcessId = {parentProcId}")) { foreach (var obj in searcher.Get()) { int childProcId = Convert.ToInt32(obj["ProcessId"]); try { var childProc = Process.GetProcessById(childProcId); childProc.WaitForExit(); } catch (ArgumentException) { // 子进程可能已提前退出,忽略该异常 } } } Console.WriteLine("Press any key to terminate this app!"); Console.ReadKey();
注意:此方案需要给项目添加
System.Management程序集引用(右键项目→添加→引用→勾选System.Management)。
内容的提问来源于stack exchange,提问作者user23207089
相关产品推荐
相关产品推荐

