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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:45:01