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

如何用C++获取Windows中与任务管理器一致的进程Dedicated GPU memory

最简C++实现:获取Windows 10+进程专属GPU内存并过滤高占用进程

核心思路

使用Windows 10引入的QueryProcessVideoMemoryInfo API(属于DXGI 1.6),直接获取进程的专属GPU内存占用,和任务管理器「详细信息」标签的数据完全一致。配合进程快照枚举所有进程,过滤出占用超过0.2GB的进程。

实现代码

#include <windows.h>
#include <tlhelp32.h>
#include <dxgi1_6.h>
#include <iostream>
#include <string>

#pragma comment(lib, "dxgi.lib")

constexpr SIZE_T MIN_VRAM_USAGE = 0.2 * 1024 * 1024 * 1024; // 0.2GB 对应字节数

int main() {
    // 初始化DXGI工厂
    IDXGIFactory6* pFactory = nullptr;
    HRESULT hr = CreateDXGIFactory2(0, IID_PPV_ARGS(&pFactory));
    if (FAILED(hr)) {
        std::cerr << "创建DXGI工厂失败: " << std::hex << hr << std::endl;
        return 1;
    }

    // 获取系统进程快照
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE) {
        std::cerr << "创建进程快照失败: " << GetLastError() << std::endl;
        pFactory->Release();
        return 1;
    }

    PROCESSENTRY32 pe32{};
    pe32.dwSize = sizeof(PROCESSENTRY32);

    // 遍历所有进程
    if (Process32First(hSnapshot, &pe32)) {
        do {
            // 打开进程,仅请求查询权限
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID);
            if (!hProcess) {
                continue; // 权限不足,跳过该进程
            }

            DXGI_QUERY_VIDEO_MEMORY_INFO memInfo{};
            // 查询进程在主GPU上的视频内存信息
            hr = pFactory->QueryProcessVideoMemoryInfo(hProcess, 0, &memInfo);
            if (SUCCEEDED(hr)) {
                SIZE_T dedicatedGB = memInfo.DedicatedUsage / (1024 * 1024 * 1024);
                SIZE_T dedicatedMB = (memInfo.DedicatedUsage % (1024 * 1024 * 1024)) / (1024 * 1024);

                // 过滤超过0.2GB的进程
                if (memInfo.DedicatedUsage > MIN_VRAM_USAGE) {
                    std::wcout << L"进程: " << pe32.szExeFile 
                               << L" | PID: " << pe32.th32ProcessID
                               << L" | 专属GPU内存: " << dedicatedGB << L"GB " << dedicatedMB << L"MB" << std::endl;
                }
            }

            CloseHandle(hProcess);
        } while (Process32Next(hSnapshot, &pe32));
    }

    CloseHandle(hSnapshot);
    pFactory->Release();

    return 0;
}

代码说明

  • DXGI API适配:QueryProcessVideoMemoryInfo的DedicatedUsage字段,完全对应任务管理器中显示的「Dedicated GPU memory」数值。
  • 进程枚举逻辑:通过CreateToolhelp32Snapshot获取全量进程列表,遍历每个进程ID进行内存查询。
  • 权限控制:仅请求PROCESS_QUERY_INFORMATION权限,避免不必要的权限申请,遇到无法访问的进程直接跳过。
  • 过滤规则:直接用字节数做判断(0.2GB=209715200字节),避免单位转换误差。

编译说明

  • 需要使用支持Windows 10 SDK的编译器(如VS2017及以上版本)。
  • 代码中已通过#pragma comment(lib, "dxgi.lib")自动链接DXGI库,无需手动配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:36:35