使用 WM_POWER 事件监控 UPS






4.19/5 (7投票s)
展示如何监控 UPS,绘制细节图表并关闭系统
更新 - 2021 年 12 月:对于那些感兴趣的人,这个项目(独立地)被用作 .NET Core 3.1 控制台/Windows 服务的基础,可以在 Github 上找到:https://github.com/zrasco/hidupsresponder。
引言
一个客户想要一个应用程序来监控和记录嵌入式 Windows 控制器的 UPS。
此工具栏小部件提供了一个框架,用于捕获 win32 WM_POWER
事件,利用它们绘制 UPS 状态图,并可以选择关闭/暂停或休眠系统。
这个应用程序非常简单,应该是一个其他相关项目的好框架。
背景
正如提供给我们的客户一样,该应用程序的功能比此处描述的要多,但是额外的功能是客户特定的,并不相关。
在寻找类似项目时,我发现了一些片段,但没有具体的。 因此,这个项目源自 maharishi_b 和 lcady 的项目。
Using the Code
该应用程序构建为一个始终运行并监控 Windows 电源事件的工具栏应用程序。 在每个事件发生时,该应用程序会将事件记录到 CSV 日志文件中,如果交流电断开,该应用程序会弹出并显示 UPS 容量和剩余时间(分钟)的图表。
所有这些功能都取决于您的 UPS 是否已插入并支持标准的 Windows HID 电源设备配置文件。
在正常运行期间,可以使用工具栏上下文菜单(右键单击工具栏图标)查看该应用程序。 使用“显示”将弹出正常操作窗口
这表明 UPS 在线,电池容量为 100%。 底部的“高”是 Windows 电源系统对电池容量的判断。 电池容量的满量程为 100%。
当交流线路断开时,主屏幕将弹出并显示电源状态
这表明交流电现在已断开,剩余电池容量为 67%。 系统仍然认为此容量为“高”。 既然交流电已断开,剩余时间变得相关,并以红色显示。 剩余时间的满量程硬编码为 60 分钟。
恢复供电后,剩余时间不再相关,系统开始重新充电电池
发生的每个事件都会记录到启动 PowerMonitor
的目录中的 log.csv 文件中。 格式如下
每个事件都按时间、日期和事件类型记录。 事件的详细信息按照系统电源状态结构进行记录
[StructLayout(LayoutKind.Sequential)]
public class SystemPowerStatus
{
public ACLineStatus ACLineStatus;
public BatteryFlag BatteryFlag;
public Byte BatteryLifePercent;
public Byte Reserved1;
public Int32 BatteryLifeTime;
public Int32 BatteryFullLifeTime;
大多数代码是不言自明的。 条形图可能是最有趣的 - 它是 lcady 条形图的演变。 我正在将它制作成一个通用的条形图类,但现在,它有点像一个简单的黑客。
我喜欢这个类绘制到 BMP,然后将 BMP 位图到图片视图的事实。 这意味着图表的构建主要独立于查看过程,并且可以卸载到其他线程。 这在通过可能较慢的设备进行数据采集时尤其重要。
关注点
将电池容量映射到剩余时间非常困难。 UPS 越来越好,但它们主要使用电池电压,这是一个非常糟糕的指标,尤其是当电池旧了、循环了很多次或者最近循环过的时候。
剩余时间只是一个指标,您采取的行动应基于您自己对交流电中断和充电时间期间收集的数据的分析。
历史
- 2011 年 11 月 30 日:初始版本
- 2021 年 12 月 2 日:文章已更新