Windows 11环境下如何通过进程名称获取外部进程的ID?
Windows 11 Rust 环境下通过进程名获取外部进程PID的实现方案
前置说明
你提到的std::process:id存在笔误,正确调用语法为std::process::id,该方法仅支持获取当前进程自身的PID,无法直接获取外部进程ID,你可以通过以下两种方案实现需求:
方案1:调用Windows原生API(仅Windows平台可用)
依赖winapi crate直接调用系统提供的进程枚举接口,性能开销最低。
第一步:添加依赖
在Cargo.toml中新增如下配置:
[dependencies] winapi = { version = "0.3", features = ["winbase", "winnt", "processthreadsapi", "tlhelp32", "handleapi"] }
第二步:实现代码
use std::ptr::null_mut; use winapi::um::tlhelp32::{CreateToolhelp32Snapshot, Process32FirstW, Process32NextW, PROCESSENTRY32W, TH32CS_SNAPPROCESS}; use winapi::um::winnt::HANDLE; fn get_pids_by_name(process_name: &str) -> Vec<u32> { let mut matched_pids = Vec::new(); unsafe { // 创建系统进程快照 let snapshot: HANDLE = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if snapshot == winapi::um::handleapi::INVALID_HANDLE_VALUE { return matched_pids; } let mut process_entry = PROCESSENTRY32W { dwSize: std::mem::size_of::<PROCESSENTRY32W>() as u32, ..Default::default() }; // 遍历快照内的所有进程 if Process32FirstW(snapshot, &mut process_entry) != 0 { loop { // 将Windows宽字符进程名转为Rust字符串 let exe_name = String::from_utf16_lossy(&process_entry.szExeFile); // 忽略大小写匹配进程名 if exe_name.eq_ignore_ascii_case(process_name) { matched_pids.push(process_entry.th32ProcessID); } if Process32NextW(snapshot, &mut process_entry) == 0 { break; } } } // 释放快照句柄 winapi::um::handleapi::CloseHandle(snapshot); } matched_pids }
方案2:使用sysinfo crate(跨平台可用)
如果你的项目需要兼容Windows、Linux、macOS多平台,使用sysinfo crate可以避免写平台特定的逻辑,开发效率更高。
第一步:添加依赖
在Cargo.toml中新增如下配置:
[dependencies] sysinfo = "0.29"
第二步:实现代码
use sysinfo::{System, SystemExt, ProcessExt}; fn get_pids_by_name(process_name: &str) -> Vec<u32> { let mut sys = System::new_all(); // 刷新系统进程列表 sys.refresh_processes(); sys.processes() .iter() .filter(|(_, process)| process.name().eq_ignore_ascii_case(process_name)) .map(|(pid, _)| pid.as_u32()) .collect() }
注意事项:
- 同一个进程名可能对应多个运行中的进程实例,因此返回结果用
Vec<u32>存储所有匹配的PID,不要只取第一个匹配项- Windows下进程名不区分大小写,匹配时统一做大小写不敏感处理可以避免漏匹配
- 枚举系统进程需要对应权限,部分受保护的系统进程无法被枚举,遇到权限问题可以尝试以管理员身份运行程序
内容的提问来源于stack exchange,提问作者chrischtel
相关产品推荐
相关产品推荐

