如何获取占用GPU的进程列表?求游戏检测替代方法及相关文档
检测占用GPU的进程及游戏运行的替代方案
以下是几种可靠的实现方式,无需依赖失效的性能计数器类:
1. 使用显卡厂商自带命令行工具
- 针对NVIDIA显卡,执行
nvidia-smi命令,输出包含进程PID、显存占用、GPU使用率等信息,可解析输出提取目标进程。 - 针对AMD显卡,使用
amdgpu-top(需安装AMD官方驱动工具包),同样能获取进程级GPU占用数据。 - C#代码示例:
var process = new Process(); process.StartInfo.FileName = "nvidia-smi"; process.StartInfo.Arguments = "--query-compute-apps=pid,process_name,used_memory --format=csv,noheader,nounits"; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.UseShellExecute = false; process.Start(); string output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); // 解析output提取进程信息
2. 调用Windows性能计数器的稳定类
放弃Win32_PerfFormattedData_GPUPerformanceCounters_GPUEngine,改用Win32_PerfFormattedData_Counters_Process结合GPU使用率计数器:
- 访问
\Process(*)\GPU Usage计数器,直接获取每个进程的GPU使用率,筛选使用率高于阈值(如5%)的进程,再结合进程名称判断是否为游戏。 - C#代码示例:
var category = new PerformanceCounterCategory("Process"); string[] instanceNames = category.GetInstanceNames(); foreach (string instance in instanceNames) { try { var gpuCounter = new PerformanceCounter("Process", "GPU Usage", instance); float usage = gpuCounter.NextValue(); if (usage > 5) // 自定义阈值 { Console.WriteLine($"进程: {instance}, GPU使用率: {usage}%"); } } catch (Exception) { // 跳过无法获取的进程 continue; } }
3. 借助Windows系统API查询GPU进程
通过psapi.dll的GetProcessMemoryInfo获取进程显存占用(需Windows 10及以上),或调用dxgi.dll的DirectX API枚举GPU资源并关联到具体进程,这种方式精度更高,但实现复杂度稍高。
4. 结合进程特征辅助判断
获取GPU占用数据的同时,可通过进程名称(如含Game、Launcher关键词)、窗口标题、进程安装路径(游戏多在特定目录)等特征辅助确认是否为游戏进程,减少误判。
内容的提问来源于stack exchange,提问作者kurdish sage
相关产品推荐
相关产品推荐

