Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • T TrafficMonitor
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 813
    • Issues 813
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 3
    • Merge requests 3
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • zhongyang219
  • TrafficMonitor
  • Wiki
  • 插件开发指南

插件开发指南 · Changes

Page history
添加插件开发指南 authored Nov 12, 2021 by zhongyang219's avatar zhongyang219
Hide whitespace changes
Inline Side-by-side
插件开发指南.md 0 → 100644
View page @ 9207216f
从1.82版本开始,TrafficMonitor支持插件系统,支持由用户自己开发插件。
插件可以用于在任务栏和主窗口中显示自定义项目,例如时间、日期、天气、股票等信息。
要使你编写的插件起作用,必须遵循本文所述的规范。
# 准备工作
要为TrafficMonitor开发插件,首先你必须要懂得如果编写C++程序,因为TrafficMonitor是用C++语言开发的,插件也必须使用C++语言编写。
同时你还必须具备一种Windows平台下支持C++的GUI技术,例如MFC、Qt等。
# 开发步骤
* 一切准备就绪后,你需要通过你的IDE创建一个**动态库**项目。
* 然后将[`PluginInterface.h`](https://github.com/zhongyang219/TrafficMonitor/blob/master/include/PluginInterface.h)这个C++头文件添加到你的项目中。这个文件非常重要,里面包含插件系统所有接口类的定义。
* 在你的项目中导出一个名为`TMPluginGetInstance`的函数,函数签名如下:
```c++
ITMPlugin* TMPluginGetInstance();
```
函数返回值为一个ITMPlugin接口的指针,参数列表为空。
注意,此函数的实现中返回一个已存在对象的指针,不需要创建新的对象,框架也不负责释放此对象。
示例代码如下:
```c++
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) ITMPlugin* TMPluginGetInstance();
#ifdef __cplusplus
```
* 编写一个类,实现`ITMPlugin`接口。此类的对象在内存中仅存在一个,由TMPluginGetInstance函数返回。
* 根据你的插件提供的显示项目,编写对应的类,并实现`IPluginItem`接口。类的对象一般可作为`ITMPlugin`派生类的成员变量。例如,你的插件将提供时间和日期两个显示项目,则你需要编写两个类,它们都派生自`IPluginItem`接口,并将这两个类的对象作为`ITMPlugin`派生类的成员。
* 编译你的项目,将生成的dll文件复制到TrafficMonitor主程序所在目录下的`plugins`目录下,启动TrafficMonitor,插件将自动被加载。
在TrafficMonitor右键菜单中选择“其他功能”——“插件管理”,在插件管理对话框中可以看到已加载的插件。如下图所示:
<img src="images/image-20211112165246213.png" alt="image-20211112165246213" style="zoom:80%;" />
TrafficMonitor的源代码中提供了一个我写好的插件示例[PluginDemo](https://github.com/zhongyang219/TrafficMonitor/tree/master/PluginDemo),它提供了时间和日期显示,以及一个自绘示例。插件的开发者可以以此示例为参考来开发TrafficMonitor的插件。
# 接口说明
## ITMPlugin接口
此接口为插件接口,派生自此接口的类必须重写必要的虚函数。
### GetAPIVersion
此函数返回接口的版本,仅当修改了插件接口时才会修改这里的返回值。插件开发者不应该修改这里的返回值,也不应该重写此虚函数。
### GetItem
此函数用于返回此插件提供的显示项目的对象。
**函数原型**
```c++
virtual IPluginItem* GetItem(int index) = 0;
```
**说明**
一个插件dll可以提供多个实现IPluginItem接口的对象,对应多个显示项目。此函数根据index的值返回对应的对象。
当index的值大于或等于0且小于IPluginItem接口的对象的个数时,返回对象的IPluginItem接口的指针,其他情况应该返回空指针。
### DataRequired
**函数原型**
```c++
virtual void DataRequired() = 0;
```
**说明**
此函数由主程序每隔一定时间调用,插件需要在这里获取一次所有显示项目的数据。
### ShowOptionsDialog
**函数原型**
```c++
virtual OptionReturn ShowOptionsDialog(void* hParent);
```
**说明**
此函数不一定要重写。如果插件提供了选项设置界面,则应该重写此函数,并在最后返回OR_OPTION_CHANGED或OR_OPTION_UNCHANGED。
*hParent*
选项设置对话框的父窗口的句柄。
*返回值*
返回一个枚举值。
OR_OPTION_CHANGED: 选项设置对话框中更改了选项设置
OR_OPTION_UNCHANGED: 选项设置对话框中未更改选项设置
OR_OPTION_NOT_PROVIDED: 未提供选项设置对话框
如果在派生类中重写了此函数,则必须返回OR_OPTION_CHANGED或OR_OPTION_UNCHANGED,不能返回OR_OPTION_NOT_PROVIDED。
### GetInfo
**函数原型**
```c++
virtual const wchar_t* GetInfo(PluginInfoIndex index) = 0;
```
**说明**
主程序调用此函数以获取此插件的信息。根据index的值返回对应的信息。
index的值请参见PluginInfoIndex类型的注释。
### OnMonitorInfo
**函数原型**
```c++
virtual void OnMonitorInfo(const MonitorInfo& monitor_info);
```
**说明**
此函数不一定要重写。主程序在获取到监控信息时,会调用此函数以向插件传递所有获取到的监控信息。这就意味着,在插件中也可以获取到主程序中取得的例如网速、CPU和内存利用率、温度等信息。
*monitor_info*
MonitorInfo结构的对象,包含了主程序中取得的所有监控信息。
## IPluginItem接口
此接口为插件显示项目接口,你需要为你的插件提供的每一个显示项目编写对应的类,并实现此接口。
### GetItemName
**函数原型**
```c++
virtual const wchar_t* GetItemName() const = 0;
```
**说明**
返回插件项目的名称。这个名称将显示在TrafficMonitor任务栏右键菜单“显示项目”子菜单下,以及选项设置对话框中的“主窗口设置”和“任务栏窗口设置”中的“显示设置”对话框和文本颜色设置对话框中,如下图所示:
<img src="images/image-20211112165501363.png" alt="image-20211112165501363" style="zoom:80%;" />
### GetItemId
**函数原型**
```c++
virtual const wchar_t* GetItemId() const = 0;
```
**说明**
函数返回一个字符串,用作显示项目的唯一ID,用于区分每个显示项目。应该确保此ID不会和其他插件显示项目重复。
### GetItemLableText
**函数原型**
```c++
virtual const wchar_t* GetItemLableText() const = 0;
```
**说明**
函数返回一个字符串,作为显示项目的标签文本。
### GetItemValueText
**函数原型**
```c++
virtual const wchar_t* GetItemValueText() const = 0;
```
**说明**
函数返回一个字符串,作为显示项目的数值的文本。
**注意**
由于此函数可能会被频繁调用,因此不要在这里获取监控数据,而是在ITMPlugin::DataRequired函数中获取。在这里返回获取到的用于显示的字符串格式的数值。
### GetItemValueSampleText
**函数原型**
```c++
virtual const wchar_t* GetItemValueSampleText() const = 0;
```
**说明**
函数返回一个字符串,作为显示项目数值的示例文本。这里返回的文本会用作“更换皮肤”对话框中预览图中显示的文本,同时也用于根据此字符串的长度计算任务栏显示项目的宽度。
### IsCustomDraw
**函数原型**
```c++
virtual bool IsCustomDraw() const;
```
**说明**
此函数仅需返回true或false即可。用于设置此显示项目的显示区域是否由插件自行绘制。
如果此函数返回false,则此显示项目不由插件自行绘制,而是由主程序绘制。主程序将根据GetItemLableText和GetItemValueText返回的文本绘制显示区域,此时重写DrawItem函数将不起作用。
如果此函数返回true,则显示项目由插件自行绘制。需要绘制显示区域时,则主程序调用DrawItem函数进行绘制。此时必须重写DrawItem函数并在里面添加绘制显示区域的代码,此时GetItemLableText、GetItemValueText和GetItemValueSampleText的返回值将被主程序忽略。
### GetItemWidth
**函数原型**
```c++
virtual int GetItemWidth() const
```
**说明**
此函数用于获取显示区域的宽度。只有当CustomDraw函数返回true时重写此函数才有效。
**注意**
* 返回的值为DPI为96(100%)时的宽度,主程序会根据当前系统DPI的设置自动按比例放大,因此你不需要为不同的DPI设置返回不同的值。
* 这里的返回值代表了自绘区域所需要的最小宽度,DrawItem函数中的参数w的值可能会大于这个值
### DrawItem
**函数原型**
```c++
virtual void DrawItem(void* hDC, int x, int y, int w, int h, bool dark_mode)
```
**说明**
重写此函数并添加绘图的代码,用于自定义绘制显示区域,只有当CustomDraw函数返回true时重写此函数才有效。
*hDC*
绘图的上下文句柄。
*x, y, w, h*
绘图的矩形区域。
*dark_mode*
是否为深色模式。
Clone repository

TrafficMonitor Wiki 导航

首页

  • 主窗口
  • 任务栏窗口
  • 右键菜单
  • 选项设置
    • 主窗口设置
    • 任务栏窗口设置
    • 常规设置
  • 硬件监控功能
  • 选择监控的网络连接
  • 更换皮肤功能
  • 通知区图标
  • 历史流量统计
  • 配置和数据文件
  • 插件开发指南

更新日志 - Update Log

常见问题 - Frequently Asked Questions

已知问题