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

如何关闭WPF中通过Launcher.LaunchUriAsync打开的Win10应用?

解决方案:延迟关闭通过Launcher启动的Windows应用

当然可行!不过因为Launcher.LaunchUriAsync只会返回启动是否成功的结果,不会直接返回目标应用的进程句柄,所以我们需要先找到对应的进程,再实现延迟关闭的逻辑。以下是具体的步骤和代码示例:

核心思路

  • 用Launcher.LaunchUriAsync启动目标应用(比如Windows设置)
  • 查找该应用对应的系统进程(通过进程名或窗口标题)
  • 延迟指定时间后,关闭找到的进程

完整代码示例

结合你原来的代码,修改后的实现如下:

using System.Diagnostics;
using System.Threading.Tasks;
using Windows.System;

private async void OpenAppAndDelayClose()
{
    // 1. 启动Windows设置应用
    var launchUri = new Uri("ms-settings:");
    var success = await Launcher.LaunchUriAsync(launchUri);
    
    if (success)
    {
        // 2. 等待应用完全启动(可根据实际情况调整等待时长)
        await Task.Delay(2000);
        
        // 3. 查找Windows设置的进程(进程名为SystemSettings.exe)
        var targetProcesses = Process.GetProcessesByName("SystemSettings");
        
        if (targetProcesses.Length > 0)
        {
            // 4. 延迟指定时间后关闭进程(这里设置为5秒)
            await Task.Delay(5000);
            
            foreach (var process in targetProcesses)
            {
                try
                {
                    // 优先模拟点击关闭按钮,更友好(若有未保存内容会弹窗提示)
                    process.CloseMainWindow();
                    // 等待进程退出,超时则强制终止
                    if (!process.WaitForExit(3000))
                    {
                        process.Kill();
                    }
                }
                catch (Exception ex)
                {
                    // 处理异常,比如权限不足、进程已提前关闭等
                    Debug.WriteLine($"关闭进程失败: {ex.Message}");
                }
                finally
                {
                    process.Dispose();
                }
            }
        }
        else
        {
            Debug.WriteLine("未找到目标进程");
        }
    }
    else
    {
        Debug.WriteLine("启动应用失败");
    }
}

关键细节说明

  • 进程查找:不同的Windows应用对应不同的进程名,比如Windows设置是SystemSettings.exe,你可以通过任务管理器查看目标应用的进程名。如果进程名不唯一,也可以通过process.MainWindowTitle匹配窗口标题来筛选。
  • 延迟时间:Task.Delay(2000)是等待应用启动完成的缓冲时间,避免还没启动就查找进程导致找不到;后面的Task.Delay(5000)是你想要的延迟关闭时长,可根据需求自由调整。
  • 关闭方式:优先用CloseMainWindow()(模拟用户手动关闭窗口),如果超时未退出再用Kill()强制终止,尽量保证操作的友好性。
  • 权限问题:部分系统应用可能需要管理员权限才能关闭,此时需要给你的WPF应用添加管理员权限(右键项目→属性→安全性→勾选"启用ClickOnce安全设置",然后设置权限为完全信任)。

扩展适配

如果你的目标应用是第三方软件,只需要替换对应的进程名或者调整进程查找逻辑即可。比如要关闭Edge浏览器,进程名是msedge.exe。

内容的提问来源于stack exchange,提问作者Anil P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:37:20