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

