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

如何从Flutter Windows应用程序中关闭其他exe进程?

在Flutter Windows应用退出时关闭外部EXE的实现方法

这里提供两种可行的实现方案,分别适合不同场景需求:

方案一:通过dart:io调用Windows系统命令终止进程

这种方式无需额外依赖,直接利用Windows自带的taskkill命令实现,适合简单场景。

实现步骤

  1. 监听Flutter应用的生命周期状态,捕获退出事件;
  2. 在应用进入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系统进程,适合需要精确控制或复杂场景。

实现步骤

  1. 在pubspec.yaml中添加win32依赖;
  2. 编写代码枚举系统进程,匹配目标EXE后调用TerminateProcess终止。

代码示例

  1. 先添加依赖:
dependencies:
  flutter:
    sdk: flutter
  win32: ^5.0.0 # 使用最新版本即可
  1. 核心代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:45:33