如何使用 EnumProcesses 在 Dart (Windows) 中获取进程 PID
How get process PID in Dart (Windows) with EnumProcesses
我可以创建函数从 PID 获取路径,但现在我必须获取进程 PID。
String _getProcessPath(int processID) {
var path = '';
var hProcessHandle = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
var lpFilename =
'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
.toNativeUtf16();
var nSize = MAX_PATH;
GetModuleFileNameEx(hProcessHandle, NULL, lpFilename, nSize);
path = lpFilename.toDartString();
CloseHandle(hProcessHandle);
free(lpFilename);
return path;
}
我知道首先我需要 EnumProcesses 并且在那里我可以获得 PID,但是在 dart 2.12.0 上我误解了如何调用它。互联网使用的几个例子 allocate
,在当前 ffi 中不存在。
numProcesses(Pointer<Uint32> lpidProcess, int cb, Pointer<Uint32> lpcbNeeded)
需要指针,但我不知道如何在不分配的情况下创建它。
需要帮助,谢谢。
您可以在完全不影响 FFI 的情况下完成此操作。只需 运行 Windows cmd 程序 tasklist
并解析输出。
(我目前没有坐在 Windows 电脑前进行测试,但它应该非常接近准确。)
import 'dart:io';
import 'dart:convert';
Future<Map<String, int>> getPids() async {
final tasklistProc = Process.run('START', ['/B', 'tasklist', '/NH', '/FO', 'csv']);
final stream = tasklistProc.stdout.transform(utf8.decoder).transform(LineSplitter());
final pids = <String, int>{};
await for (var line in stream) {
final elems = line.split(',').map((elem) => elem.replaceAll('"', '')).toList();
final name = elems[0];
final pid = int.parse(elems[1]);
// final session = elems[2];
// final sessionNumber = int.parse(elems[3]);
// final memUsage = elems[4];
pids[name] = pid;
}
return pids;
}
allocate
替换为 calloc
:
final Pointer<Uint32> aPointer = calloc<Uint32>();
// Code using it goes here.
calloc.free(aPointer);
谢谢,用 calloc.allocate() 方法搞定了。
我可以创建函数从 PID 获取路径,但现在我必须获取进程 PID。
String _getProcessPath(int processID) {
var path = '';
var hProcessHandle = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
var lpFilename =
'000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
.toNativeUtf16();
var nSize = MAX_PATH;
GetModuleFileNameEx(hProcessHandle, NULL, lpFilename, nSize);
path = lpFilename.toDartString();
CloseHandle(hProcessHandle);
free(lpFilename);
return path;
}
我知道首先我需要 EnumProcesses 并且在那里我可以获得 PID,但是在 dart 2.12.0 上我误解了如何调用它。互联网使用的几个例子 allocate
,在当前 ffi 中不存在。
numProcesses(Pointer<Uint32> lpidProcess, int cb, Pointer<Uint32> lpcbNeeded)
需要指针,但我不知道如何在不分配的情况下创建它。
需要帮助,谢谢。
您可以在完全不影响 FFI 的情况下完成此操作。只需 运行 Windows cmd 程序 tasklist
并解析输出。
(我目前没有坐在 Windows 电脑前进行测试,但它应该非常接近准确。)
import 'dart:io';
import 'dart:convert';
Future<Map<String, int>> getPids() async {
final tasklistProc = Process.run('START', ['/B', 'tasklist', '/NH', '/FO', 'csv']);
final stream = tasklistProc.stdout.transform(utf8.decoder).transform(LineSplitter());
final pids = <String, int>{};
await for (var line in stream) {
final elems = line.split(',').map((elem) => elem.replaceAll('"', '')).toList();
final name = elems[0];
final pid = int.parse(elems[1]);
// final session = elems[2];
// final sessionNumber = int.parse(elems[3]);
// final memUsage = elems[4];
pids[name] = pid;
}
return pids;
}
allocate
替换为 calloc
:
final Pointer<Uint32> aPointer = calloc<Uint32>();
// Code using it goes here.
calloc.free(aPointer);
谢谢,用 calloc.allocate() 方法搞定了。