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

