如何关闭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
相关产品推荐
相关产品推荐

