如何从Flutter Windows应用程序中关闭其他exe进程?
在Flutter Windows应用退出时关闭外部EXE的实现方法
这里提供两种可行的实现方案,分别适合不同场景需求:
方案一:通过dart:io调用Windows系统命令终止进程
这种方式无需额外依赖,直接利用Windows自带的taskkill命令实现,适合简单场景。
实现步骤
- 监听Flutter应用的生命周期状态,捕获退出事件;
- 在应用进入
detached状态时,执行taskkill命令关闭目标EXE。
代码示例
import 'dart:io'; import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); // 添加生命周期观察者 WidgetsBinding.instance.addObserver(_AppLifecycleWatcher()); } class _AppLifecycleWatcher extends WidgetsBindingObserver { @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); // 应用彻底退出时触发 if (state == AppLifecycleState.detached) { const targetExeName = "your_target.exe"; // 替换为目标EXE文件名 // 执行强制终止命令:/f 强制关闭,/im 指定进程名 Process.run("taskkill", ["/f", "/im", targetExeName]); } } } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold(appBar: AppBar(title: const Text("Demo"))), ); } }
注意点
- 如果存在多个同名进程,
taskkill会终止所有匹配项;若需要精确终止单个进程,可先通过tasklist命令获取目标进程的PID,再用taskkill /f /pid [PID]执行。
方案二:使用win32插件调用Windows原生API
这种方式更灵活,能直接操作Windows系统进程,适合需要精确控制或复杂场景。
实现步骤
- 在
pubspec.yaml中添加win32依赖; - 编写代码枚举系统进程,匹配目标EXE后调用
TerminateProcess终止。
代码示例
- 先添加依赖:
dependencies: flutter: sdk: flutter win32: ^5.0.0 # 使用最新版本即可
- 核心代码:
import 'package:flutter/material.dart'; import 'package:win32/win32.dart'; void main() { runApp(const MyApp()); WidgetsBinding.instance.addObserver(_AppLifecycleWatcher()); } class _AppLifecycleWatcher extends WidgetsBindingObserver { @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); if (state == AppLifecycleState.detached) { _terminateTargetExe("your_target.exe"); } } void _terminateTargetExe(String exeName) { // 创建进程快照 final snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (snapshot == INVALID_HANDLE_VALUE) return; final processEntry = PROCESSENTRY32.allocate(); try { if (!Process32First(snapshot, processEntry)) return; do { // 转换进程名为Dart字符串 final currentProcessName = processEntry.szExeFile.toDartString(); if (currentProcessName.toLowerCase() == exeName.toLowerCase()) { // 打开进程获取终止权限 final processHandle = OpenProcess(PROCESS_TERMINATE, FALSE, processEntry.th32ProcessID); if (processHandle != NULL) { TerminateProcess(processHandle, 0); // 终止进程 CloseHandle(processHandle); } } } while (Process32Next(snapshot, processEntry)); } finally { CloseHandle(snapshot); free(processEntry.address); } } } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold(appBar: AppBar(title: const Text("Demo"))), ); } }
注意点
- 若目标进程以管理员权限运行,Flutter应用也需要以管理员权限启动才能成功终止;
- 需注意内存释放,避免资源泄漏。
额外提示
如果外部EXE是由你的Flutter应用启动的,建议在启动时记录进程的PID,退出时直接根据PID终止,能完全避免误杀同名进程的问题。
内容的提问来源于stack exchange,提问作者gregory jithin
相关产品推荐
相关产品推荐

