TrafficMonitor 的插件,显示每个进程的 CPU / 内存 / 磁盘 IO / GPU / 显存占用排行。与 ProcessNetMonitor(进程网速插件)同形式并存,悬浮窗自动互相避让。
- 五维进程排行:CPU / 内存 / 磁盘 IO / GPU / 显存,每窗 Top 10(行数可调),头部可选叠加宿主温度与 CPU 频率
- CPU 视图核型分列(混架 CPU 专属形态):Intel 大小核显示「P核 / E核」双列,AMD X3D 双 CCD 显示「X3D / 标准」双列——与总量共用一个 CPU 视图,检测到混架自动启用、同构机器自动回落纯总量;设置「显示 → CPU 视图」可手动切换「核型分列 / 仅总量」(仅混架机器出现该选项);CPU 行悬停明细、托盘提示 CPU 行
(P xx · E xx)系统级汇总 - 磁盘 IO 按进程精确统计:ETW FileIo 只算真实文件读写,「读 / 写」双列;ETW 不可用时回退每进程 IO 总计口径,悬浮窗如实标注当前口径与原因
- GPU 与任务管理器同口径:每进程取最忙引擎;显存支持「专用」与「专用 + 共享」
- 出现方式随人:默认悬停 TrafficMonitor 主窗或任务栏 400 ms 弹出、离开 300 ms 收起;也可常驻显示(可拖动、记忆位置),或最多 6 窗并排(每窗固定一种指标,右键增删);hover 态跟随 TM 主窗移动,与 ProcessNetMonitor 并存自动避让
- 常驻窗置顶 / 穿透 / 自定义大小(2026-11-10):右键菜单与设置面板可关「窗口置顶」——窗口落到桌面部件层(壁纸之上、所有普通窗口之下,Win+D 仍可见);「鼠标穿透」开启后悬浮窗不接收任何鼠标输入(点击 / 滚轮全部落到下层窗口,成为纯显示 HUD,取消入口在设置面板);常驻 / 固定态可拖边缘自由调整大小(拉高显示更多行,上限 15 行;记忆大小,右键「恢复默认大小」一键还原)。数据刷新不再扰动窗口层级——本窗与其他软件的置顶菜单 / 悬浮窗互不遮挡
- 任务栏 item:显示 CPU 第一名的进程名和占用,点击弹出 / 收回悬浮窗组
- 四档视觉效果(亚克力 / 透明 / 模糊 / 不透明),深浅色跟随系统,高 DPI 适配
- 中英双语:跟随 TrafficMonitor 语言或手动指定
每次刷新用 NtQuerySystemInformation(SystemProcessInformation) 单次快照取全进程的内核 + 用户 CPU 时间、工作集 / 专用提交页数、IO 读写字节累计,相邻两拍差分得到占用与速率。Idle 不进榜但参与系统占用汇总;System(PID 4)保留——它做真实工作(lazy writer 等)。
启动时识别拓扑:CPU EfficiencyClass 出现两种值 → Intel P/E 口径;全部同档但 L3 缓存簇存在两种容量 → AMD X3D 口径(96MB 簇 = X3D);否则视为同构——CPU 视图恒纯总量形态,设置项不出现(界面零变化)。
CPU 视图形态自适应(2026-11-09 合并):混架机器默认「核型分列」,可在设置「显示 → CPU 视图」切「仅总量」(此时不为核型采样启内核会话);核型数据临时不可用(如无管理员权限)时行区自动回落纯总量并给出 ⚠ 说明,不显示假 0。
计量走内核调度事件(需管理员权限,与磁盘 IO 共用会话):按 CSwitch 区间时间账 把每个核的时间段结算给当时在跑的进程,再按核群归类——与任务管理器同源口径(实测满载单核 = 6 线程占 24 逻辑核的 25%),总 CPU ≈ P 列 + E 列。
两种百分比口径(注意区分):
| 位置 | 分母 | 回答的问题 |
|---|---|---|
| 核型分列的进程行 / CPU 行悬停明细 | 全机核容量 | 「这个进程占全机多少、落在哪个核池」——与 CPU 列同分母,可直接相加 |
摘要行(P核 38.2 · E核 12.7)/ 托盘 (P xx · E xx) |
各核群自身容量 | 「每个核池有多忙」——P 核群忙 38%、E 核群忙 12%,两数不做加法 |
对账关系:P群总 × P核数/总核数 + E群总 × E核数/总核数 ≈ 下方全部行加总。
System 进程归因与「其余合计」行(2026-11-10):System(pid 4)的内核线程时间默认计入核型归因(P/E 账含内核负载,与摘要对得上账),可在设置「显示」区关闭(仅混架机器出现该选项)。进程列表末尾有灰字「其余合计」行——未进列表的其余进程与未归因时间的合计(与行值同口径),让「上方汇总 vs 下方加总」账面闭合;核型分列形态下 P/E 各一值,纯总量形态为单值。
会话不可用(无管理员权限等)时核型明细如实标注原因并回落总量,不显示假 0;权限恢复后自动恢复。
- 主方案(Win8+,需管理员权限):自建系统日志会话
PTMFileIoSession(EVENT_TRACE_FLAG_FILE_IO,实时消费),与 ProcessNetMonitor 的 NT Kernel Logger 共存(多系统会话是 Win8+ 特性,互不抢占) - TDH 解析 FileIo 事件按 PID 累计读 / 写字节,按刷新窗口差分出速率
- 累计式 handoff:消费 tick 超时也不丢一窗数据(字节 + 窗口时长累计,下一拍合并消费);不完整的窗口不接管,回退期间数据连续不闪 0
- 按需启停 + 迟停:没有磁盘 IO 视图时 ETW 会话自动停止;180 s 迟停窗内切回零冷启动,超时真停后切回走快重试(250 ms × 4,残留会话自动接管,实测亚秒回精确口径)
ETW 不可用时回退 SystemProcessInformation 的每进程 IO 计数器(全部句柄——文件 + 网络 + 管道等),按拍差分照常出排行;悬浮窗标注当前口径与原因。ETW 重试成功自动切回精确口径。
- G1(Win10 1709+):PDH
\GPU Engine(*)\Utilization Percentage/GPU Process Memory/GPU Adapter Memory,引擎类型聚合 - G2(Win8 ~ Win10 1607):
D3DKMTQueryStatistics(gdi32 动态加载,微软 DDI 官方文档最低 Windows 8);利用率 = NodeRunningTime 差分 ÷ (dt × 节点数),显存仅专用口径;此档无引擎命名,引擎类型口径降级为全部节点求和,界面如实标注 - G3(Win7 / 无 GPU):GPU / 显存排行维度隐藏(WDDM 1.1 无可靠的 per-process 路线,任务管理器也从未提供),头部摘要保留整机 GPU 利用率(取自 TrafficMonitor 宿主)
- 编译器:MSVC 14.44.35207 (Visual Studio 2022 BuildTools)
- SDK:Windows SDK 10.0.26100.0
- C++ 标准:C++17
- 依赖库:gdi32.lib, user32.lib, shell32.lib, dwmapi.lib, advapi32.lib, tdh.lib, comctl32.lib, imm32.lib, msimg32.lib, pdh.lib
- CRT:静态链接(/MT),零第三方依赖;链接显式
/OPT:REF
plugin\build_release.bat一次编译 x64 与 x86 两个 DLL,产出在 plugin\ 下(ProcessTopMonitor.dll / ProcessTopMonitor_x86.dll)。
注意:脚本头部硬编码了本机的 MSVC / SDK 路径(VS2022 BuildTools + Windows SDK 10.0.26100),换环境先改 MSVC、SDK、SDKVER 三个变量。
部署:关闭 TrafficMonitor(TM 只能单实例)→ 按宿主位数把 DLL 拷到 <TM>\plugins\ → 启动 TrafficMonitor(管理员权限可解锁磁盘 IO 精确口径)。
ProcessTopMonitor/
├── plugin/
│ ├── build_release.bat # 一键编译(x64 + x86)
│ ├── src/
│ │ ├── PluginInterface.h # TM 插件接口定义
│ │ ├── plugin_main.h / .cpp # 插件主体(item / hover 状态机 / pin / 设置)
│ │ ├── window_manager.h / .cpp # 窗组管理(组布局 / 显示 / 锚跟随 / PNM 避让)
│ │ ├── top_list_window.h / .cpp # 悬浮窗(ULW 视觉管线 / 菜单 / 交互)
│ │ ├── top_aggregator.h / .cpp # 排行聚合(同名合并 / 排序 / TopN)
│ │ ├── metrics_collector.h / .cpp # CPU / 内存 / IO 基础采集(SystemProcessInformation)
│ │ ├── etw_file_collector.h / .cpp # ETW FileIo 精确磁盘 IO(A/B/C 三档)
│ │ ├── gpu_collector.h / .cpp # GPU / 显存采集(G1 PDH / G2 D3DKMT)
│ │ ├── options_dialog.h / .cpp # 设置对话框
│ │ ├── i18n.h / .cpp # 本地化(跟随 TM 语言)
│ │ ├── lang/English.ini # 英文语言文件(与 TM 语言文件同格式)
│ │ └── resource.rc / app.ico # 资源与插件图标
│ ├── ProcessTopMonitor.dll # 64 位编译输出
│ └── ProcessTopMonitor_x86.dll # 32 位编译输出
├── docs/
│ └── screenshots/ # README 界面图
└── README.md
插件 UI 默认中文,跟随 TrafficMonitor 主程序语言自动切换:
- 语言文件位于
plugins/ProcessTopMonitor/lang/(插件配置目录内),格式与 TM 的language/*.ini完全一致(UTF-8 BOM,[text]section,KEY = "value") - 中文为内置兜底:未找到语言文件或 key 未翻译时自动显示中文原文
- 内置 English;界面语言也可在插件「选项」手动选择(重启后保持)
无需编译,只需提交一个 ini 文件:
- 复制
plugin/src/lang/English.ini为plugin/src/lang/<语言名>.ini - 修改
[general]的BCP_47(如id-ID)与DISPLAY_NAME - 把
[text]中每个"英文"翻译成你的语言(key 保持中文原文不变) - 安装时把 ini 放入
plugins/ProcessTopMonitor/lang/
- TrafficMonitor → 右键 → 插件管理 → 勾选启用 ProcessTopMonitor
- 在任务栏设置中把 ProcessTopMonitor 的 item 添加到任务栏(CPU Top1 进程 + 点击弹出悬浮窗组)
- 插件管理 → ProcessTopMonitor → 「选项」调整:出现方式(悬停 / 常驻)、默认指标、多窗口并排、刷新率(250 / 500 / 1000 / 2000 ms)、内存口径、显存口径、IO 视图、GPU 引擎、效果与透明度、传感器摘要等
- 设置:
settings.json,位于 TM 插件配置目录下的ProcessTopMonitor\(非 portable 模式在%APPDATA%\TrafficMonitor\plugins\,portable 模式在<exe_dir>\plugins\;跟随 TrafficMonitor 的模式) - 格式版本 schema 3,自动兼容 / 迁移 v1 / v2 旧配置
- 调试与崩溃:同目录
debug\(目录树见下节)
- 开关:插件「选项」→「日志与诊断」板块(调试日志 + 崩溃转储开关 + 「打开目录」按钮)
- 位置:全部输出与配置同处一处:
plugins/ ├── ProcessTopMonitor.dll └── ProcessTopMonitor/ ├── settings.json ← 配置 ├── lang/ ← 语言文件(如 English.ini) └── debug/ ├── werdumps/ ← WER 转储目录(崩溃转储开启时自动注册) ├── etw_file.log ← ETW 磁盘 IO 采集诊断(调试日志开启后生成) ├── crash.log ← 崩溃日志(仅崩溃时生成) └── crash.dmp ← 崩溃转储(仅崩溃时生成) - 崩溃日志不受开关控制:crash.log / crash.dmp / werdumps 仅在崩溃时写入,平时不产生文件,保持始终启用以便排查闪退
- 遇到闪退时:把
debug/目录(含 crash.log、werdumps 下的 .dmp)连同 DLL 版本一起反馈即可定位
本项目采用 GPL-3.0 许可证。基于 TrafficMonitor 插件接口开发,遵循其 GPL-3.0 许可。




