You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法等待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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:52:45