Skip to content
 
 

Latest commit

 

History

106 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ProcessNetMonitor - TrafficMonitor 插件

TrafficMonitor 的插件,显示每个进程的网络速度。

效果预览

任务栏显示

悬浮信息窗口

详情窗口-实时流量

详情窗口-历史流量

功能

  • 任务栏:两行显示,Upload 和 Download 各一行
    • 进程名左对齐、速度右对齐,不受 TM 全局「数值右对齐」设置影响,永不裁切
    U:mihomo-alp. 5.6KB/s
    D:mihomo-alp. 1.4KB/s
    
  • 透明区域(可选显示项目):任务栏上完全不可见,点击弹出悬浮信息窗口
    • 默认宽度 100px,插件「选项」中可自定义(0~500px)
    • 适合只想使用 TM 自带速度显示的用户
  • 悬浮信息窗口:鼠标悬停主悬浮窗或点击任务栏插件区域时弹出带进程图标的详情窗口
    • 进程图标 + 名称 + 上传/下载速度
    • 深色/浅色主题跟随系统设置
    • 上传/下载各显示 Top 5 进程
    • 空闲进程按 EMA(指数移动平均)排序,展示近期活跃进程
    • 圆角窗口,DWM 阴影
    • 任务栏点击弹出后,鼠标在悬浮窗或任务栏上均保持显示
  • 详情窗口(点击插件区域打开):
    • 实时流量:可排序表格,显示进程名 / 类别 / 下载速度 / 上传速度 / 连接数
    • 历史流量:按自然日(今日/昨日/近3天/近7天/近30天,本地 0 点对齐)统计每进程总流量和平均速度
    • 展开行:火绒风格,点击进程名展开显示子进程 PID / 路径 / 连接详情表(协议/本地地址/远程地址/归属地/状态)
    • 连接状态颜色编码:绿=ESTABLISHED, 蓝=LISTENING, 橙=TIME_WAIT, 深橙=CLOSE_WAIT
    • 多进程合并:Chrome 等多进程软件按名称合并为一行,展开后显示各子进程
    • 右键菜单:定位文件 / 文件属性 / 结束进程
    • 右键菜单:调试日志开关(默认关,开启后生成诊断日志,见「调试日志与崩溃排查」)
    • 历史数据持久化:关闭重启后历史数据不丢失
    • 排序状态持久化:排序设置保存到文件,TM 重启后恢复
  • 高 DPI 支持:适配 150%/175%/200% 等系统缩放,跟随显示器 DPI 变化自动调整
  • 自定义图标:详情窗口标题栏显示插件专属图标
  • 可拖拽滚动条:自绘滚动条支持鼠标拖拽、点击翻页、滚轮滚动
  • 不显示系统速度:系统速度由 TrafficMonitor 本身提供,插件只显示进程级信息
  • 右键隐藏:任务栏插件区域右键即可隐藏悬浮信息窗口
  • ETW 内核级采集(v1.10.0):优先使用 ETW(NT Kernel Logger)按进程精确统计 TCP+UDP 字节,TUN 代理环境下自动过滤虚拟网卡侧重复流量(与 AppNetworkCounter 归属一致)
  • 高频刷新(v1.10.0):自建定时器默认 500ms 刷新(插件「选项」可调 100/250/500/1000ms),滚动 1 秒速度窗口与 TM 主面板同拍
  • 附加模式提示(v1.10.0):NT Kernel Logger 被其他工具(如 AppNetworkCounter)占用时,悬浮窗显示黄色警告并提示疑似占用者
  • 进程永不消失(v1.10.0):出现过流量的进程永久保留在列表(速度显示 0)
  • 悬浮窗固定宽度(v1.10.0):长进程名自动省略号,窗口宽度不随名称伸缩
  • 签名分类(v1.11.0):程序类别列按 Authenticode 签名离线判定——系统进程(微软内嵌/目录签名)/ 第三方程序(其他有效签名)/ 未签名(无签名或签名无效);后台线程验证 + 按路径缓存,界面不卡顿
  • 进程名永不过期(v1.11.0):ProcessStart 事件正确解析,短命进程启动瞬间缓存文件名,退出后名字依然显示,不再退化成 <pid> 纯数字
  • 连接归属地显示(v1.12.0):连接表格新增「归属地」列——国内中文省市+ISP、国外中文国家+英文省市(离线库 ip2region,IPv4+IPv6 全支持,微秒级查询)
  • IP 库自动管理(v1.12.0):首次自动下载(多 CDN 源兜底)、默认 7 天自动更新、可配代理(http/socks5)、立即更新按钮、可用开关完全关闭(关闭后不下载不显示)
  • 窗口缩放与宽高记忆(v1.12.0):详情窗口可拖拽缩放、最小尺寸限制、宽高自动持久化;连接表格列宽自适应窗口;归属地超长自动换行完整显示
  • 保留地址过滤(v1.12.0):内网/环回/链路本地/组播显示 -;TEST-NET、6to4、fake-IP 基准测试段(198.18/15 等)显示「保留地址」
  • 悬浮窗避让官方鼠标提示(v1.13.0):鼠标悬停时,插件悬浮窗自动检测 TrafficMonitor 的 tooltips_class32 原生提示并水平错开到左侧或右侧,防止两个提示重叠(issue #8)
  • 历史流量自然日统计(v1.14.0):历史流量改为「今日/昨日/近3天/近7天/近30天」5 个自然日档位,按本地时间 0 点对齐;昨日平均速度按完整 24 小时计算(issue #9)
  • 原生鼠标提示开关(v1.14.0):插件「选项」可关闭 TrafficMonitor 悬停提示框中的插件进程网速段落,插件自己的悬浮窗/详情窗不受影响(issue #9)
  • ETW 智能降载(v1.16.0):ETW 主导采集后自动停用 raw socket 抓包与 EStats 轮询,不再吃掉千兆带宽 10~30% 吞吐(issue #11);ETW 静默超过 15s 自动回退传统全量采集,恢复后再次停用

流量统计原理

主方案:ETW 内核级采集(v1.10.0+)

使用 ETW 消费经典 NT Kernel Logger 会话(优先自建,缓冲 120×256KB;被其他工具占用时自动附加并提示),通过 TDH schema 解析 TcpIp/UdpIp 事件的每进程发送/接收字节数:

  • 按 PID 累计字节,滚动 1 秒窗口计算速度
  • TUN 虚拟网卡过滤:saddr/daddr 任一端落在虚拟网卡子网(如 mihomo 的 198.18.0.0/15)即过滤——同一份数据在内核出现两次(应用 TUN 侧 + 代理物理侧)时只保留物理侧
  • 兼容 TCP + UDP、IPv4 + IPv6,无需管理员权限即可消费(自建会话需管理员,普通权限自动回退)

回退方案:ETW 不可用时回退传统采集(GetPerTcpConnectionEStats TCP + raw socket UDP),并在悬浮窗提示。ETW 主导时传统采集自动停用以降低系统负载(v1.16.0+),静默超过 15s 自动回退全量采集,恢复后再次停用。

传统方案(回退)

TCP 流量

使用 GetPerTcpConnectionEStats API 直接从 TCP 协议栈内核读取每条连接的 DataBytesIn / DataBytesOut 累计值,按 PID 聚合后计算 delta 得到速度。

优势

  • 不依赖网卡抓包,WLAN/以太网/VPN 均可正常工作
  • 双向流量均准确(解决了 raw socket 在 WLAN 上无法捕获入站包的问题)
  • 自动跳过 loopback 连接(127.0.0.1),避免代理软件流量双重计算

UDP 流量

使用 raw socket(SIO_RCVALL)抓包,通过 UDP 端口到 PID 的映射表匹配进程。

网卡选择

跟随 TrafficMonitor 的网卡设置(自动选择/选择全部/指定网卡),每 5 秒检测配置变化并自动切换。

编译环境

  • 编译器:MSVC 14.44.35207 (Visual Studio 2022 BuildTools)
  • SDK:Windows SDK 10.0.26100.0
  • C++ 标准:C++17
  • 依赖库:iphlpapi.lib, ws2_32.lib, gdi32.lib, user32.lib, shell32.lib, dwmapi.lib, advapi32.lib, tdh.lib, dbghelp.lib

编译部署

:: 编译 64 位(默认)
build.bat x64

:: 编译 32 位
build.bat x86

:: 编译两个架构
build.bat all

build.bat 会自动:编译 → 杀 TM → 复制 DLL → 启动 TM

注意:如果 TM 以管理员权限运行,build.bat 用 WMI Win32_Process.Terminate 来杀进程,无需手动提权。

文件结构

ProcessNetMonitor/
├── build.bat                    # 编译+部署脚本(支持 x86/x64/all)
├── plugin/
│   ├── src/
│   │   ├── PluginInterface.h    # TM 插件接口定义
│   │   ├── capture.h / .cpp     # 传统采集(GetPerTcpConnectionEStats + raw socket,ETW 回退)
│   │   ├── etw_capture.h/.cpp   # ETW 内核级采集(NT Kernel Logger + TDH)
│   │   ├── plugin_main.h / .cpp # 插件主体(3个item:Up/Down/透明区域)
│   │   ├── tooltip_popup.h/.cpp # 富文本悬浮信息窗口
│   │   ├── detail_window.h/.cpp # 火绒风格详情窗口
│   │   ├── i18n.h / .cpp        # 轻量本地化模块(多语言支持)
│   │   ├── lang/English.ini     # 英文语言文件(与 TM 语言文件同格式)
│   │   ├── resource.rc          # 资源文件(图标)
│   │   ├── app.ico              # 插件图标
│   ├── ProcessNetMonitor.dll         # 64 位编译输出
│   ├── ProcessNetMonitor_x86.dll     # 32 位编译输出
├── TrafficMonitor/
│   └── TrafficMonitor/          # TM 主程序
│       └── plugins/             # 插件DLL放这里
└── README.md

多语言(Localization)

插件 UI 默认中文,支持跟随 TrafficMonitor 主程序语言自动切换(v1.15.0+):

  • 语言文件位于 plugins/ProcessNetMonitor/lang/(插件配置目录内),格式与 TM 的 language/*.ini 完全一致 (UTF-8 BOM,[text] section,KEY = "value"
  • 中文为内置兜底:未找到语言文件或 key 未翻译时,自动显示中文原文,不影响使用
  • 内置 English;其他语言欢迎社区贡献(见下)
  • 界面语言可跟随 TM 主程序自动切换,也可在插件「选项」手动选择(重启后保持)
  • IP 归属地随界面语言切换:中文界面显示中文国家名(ISO 映射 + 国内省市展开), 其他语言界面直接使用 ip2region 数据原文(国外字段为英文,国内段显示 China)

贡献翻译

无需编译,只需提交一个 ini 文件:

  1. 复制 plugin/src/lang/English.iniplugin/src/lang/<语言名>.ini
  2. 修改 [general]BCP_47(如 id-ID)与 DISPLAY_NAME,并在 TRANSLATOR 署名
  3. [text] 中每个 "英文" 翻译成你的语言(key 保持中文原文不变
  4. 提交 PR;安装时把 ini 放入 plugins/ProcessNetMonitor/lang/

语言文件命名与 BCP_47 的对应关系见 plugin/src/i18n.cppLangFileFromBcp47()

Contributing a translation

No compilation needed - just submit one ini file:

  1. Copy plugin/src/lang/English.ini to plugin/src/lang/<your-language>.ini
  2. Edit BCP_47 (e.g. id-ID) and DISPLAY_NAME under [general], and sign your name in TRANSLATOR
  3. Translate every "English" value under [text] into your language (keep the Chinese keys unchanged)
  4. Submit a PR; when installing, put the ini file into plugins/ProcessNetMonitor/lang/

See LangFileFromBcp47() in plugin/src/i18n.cpp for the mapping between file names and BCP_47.

TM 配置

  1. 打开 TM → 右键 → 选项 → 插件
  2. 勾选 "Up"、"Down" 和 "透明区域"(可选)显示项目
  3. 在任务栏设置中将需要的项目添加到任务栏显示

推荐设置:选项 → 主窗口设置 → 取消勾选「显示鼠标提示」,否则主悬浮窗鼠标悬停时会同时出现两个信息窗口(TM 自带的文本提示 + 本插件的富文本弹窗)

数据存储

  • 历史流量%APPDATA%\TrafficMonitor\plugins\ProcessNetMonitor\history.dat(非 portable 模式)或 <exe_dir>\plugins\ProcessNetMonitor\history.dat(portable 模式)
  • 排序/设置:同目录下 settings.json(含 debug_logs 开关,默认 false
  • 数据格式版本 v4,自动兼容 v2/v3 旧格式

调试日志与崩溃排查

  • 开关:详情窗口行右键 → 「调试日志: 关 (点击开启)」。默认关闭(不写 etw_capture.log / capture.log)
  • 位置:所有日志都写在插件目录下,与配置同处一处:
    plugins/
    ├── ProcessNetMonitor.dll
    └── ProcessNetMonitor/
        ├── settings.json / history.dat   ← 配置
        ├── lang/                         ← 语言文件(如 English.ini)
        └── debug/                        ← 诊断输出
            ├── werdumps/                 ← WER 转储目录(启动时创建,常驻空目录)
            ├── etw_capture.log           ← ETW 采集诊断(开关开启后每 5 秒一条)
            ├── capture.log               ← 传统采集诊断(开关开启后生成)
            ├── crash.log                 ← 崩溃日志(仅崩溃时生成)
            └── crash.dmp / crash.dmp.log ← 崩溃转储(仅崩溃时生成)
    
  • 崩溃日志不受开关控制:crash.log / crash.dmp / werdumps/ 仅在崩溃时写入,平时不产生文件(debug 目录仅含空的 werdumps 文件夹),保持始终启用以便排查闪退。
  • 遇到闪退时:把 debug/ 目录(含 crash.log、werdumps 下的 .dmp)连同 DLL 版本一起反馈即可定位。

版本历史

完整版本更新记录见 CHANGELOG.md

Full release history: CHANGELOG.md.

About

TrafficMonitor 的插件,显示每个进程的网络速度,参考火绒流量悬浮窗风格。TrafficMonitor plugin: per-process network speed with rich tooltip popup

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages