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

如何在Dart-win32中通过PID获取应用程序名称

通过PID获取Windows活跃应用名称(Flutter/Dart)

你已经成功获取到了活跃窗口的PID,接下来可以通过Windows API进一步获取应用名称,核心思路是通过PID打开进程句柄,再查询进程的可执行文件路径并提取文件名。以下是完整实现代码:

import 'dart:ffi' as ffi;
import 'package:ffi/ffi.dart';
import 'package:win32/win32.dart' as win;

void main() {
  ffi.Pointer<ffi.Uint32> pidPointer = calloc();
  int hwnd = win.GetForegroundWindow();
  win.GetWindowThreadProcessId(hwnd, pidPointer);
  int pid = pidPointer.value;
  print('Process ID of the active window: $pid');
  
  // 打开进程获取句柄
  final processHandle = win.OpenProcess(
    win.PROCESS_QUERY_INFORMATION | win.PROCESS_VM_READ,
    false,
    pid,
  );
  
  if (processHandle == win.INVALID_HANDLE_VALUE) {
    print('无法打开进程,错误码: ${win.GetLastError()}');
    win.free(pidPointer);
    return;
  }
  
  try {
    // 分配缓冲区存储进程路径
    final buffer = calloc<ffi.Uint16>(win.MAX_PATH).cast<win.WCHAR>();
    final pathLength = win.GetModuleFileNameEx(
      processHandle,
      ffi.nullptr, // 获取主模块路径
      buffer,
      win.MAX_PATH,
    );
    
    if (pathLength == 0) {
      print('无法获取进程路径,错误码: ${win.GetLastError()}');
      win.free(buffer);
      win.free(pidPointer);
      return;
    }
    
    // 将宽字符串转为Dart字符串
    final processPath = buffer.toDartString();
    // 提取文件名作为应用名称
    final appName = processPath.split('\\').last;
    print('Active app name: $appName');
    
    win.free(buffer);
  } finally {
    // 关闭进程句柄,避免资源泄漏
    win.CloseHandle(processHandle);
    win.free(pidPointer);
  }
}

关键说明:

  • OpenProcess:需要传入PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限才能查询进程信息,返回INVALID_HANDLE_VALUE则表示打开失败。
  • GetModuleFileNameEx:获取进程主模块的完整路径,需传入进程句柄和足够大的缓冲区。
  • 资源释放:必须调用CloseHandle关闭进程句柄,calloc分配的内存要通过free释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Sharif Ahamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:32:45