c++ - 检测电源变化事件/UPS 状态
问题描述
我想检测系统何时开启UPS
或只是电源状态发生变化。
像这样的东西:
我尝试使用GetSystemPowerStatus
函数检测它:
代码:
SYSTEM_POWER_STATUS powerStatus;
bool powerStatusRes = GetSystemPowerStatus(&powerStatus);
switch (powerStatus.ACLineStatus) {
case 0:
std::cout << "Offline" << std::endl;
break;
case 1:
std::cout << "Online" << std::endl;
break;
case 255:
std::cout << "Unknown status" << std::endl;
default:
std::cout << "Failed to detect the status" << std::endl;
}
switch (powerStatus.BatteryFlag) {
case 1:
std::cout << "High — the battery capacity is at more than 66 percent" << std::endl;
break;
case 2:
std::cout << "Low — the battery capacity is at less than 33 percent" << std::endl;
break;
case 4:
std::cout << "Critical — the battery capacity is at less than five percent" << std::endl;
break;
case 8:
std::cout << "Charging" << std::endl;
break;
case 128:
std::cout << "No system battery" << std::endl;
break;
case 255:
std::cout << "Unknown status—unable to read the battery flag information" << std::endl;
break;
default:
std::cout << "Failed to detect the battery flag" << std::endl;
}
但它返回powerStatus.ACLineStatus
for UPS
or AC
asOnline
和 for powerStatus.BatteryFlag
- No system battery
。
我也尝试检测UPS
使用GetPwrCapabilities
功能:
代码:
SYSTEM_POWER_CAPABILITIES SysPowerCapabilities = {0};
if (!GetPwrCapabilities(&SysPowerCapabilities)){
std::cout << "Failed to get System Power information!" << std::endl;
}
if (SysPowerCapabilities.UpsPresent) {
std::cout << "UPS found" << std::endl;
} else {
std::cout << "UPS not found" << std::endl;
}
它返回 - UPS not found
(驱动程序不适用于此UPS
型号)。
现在我正在尝试使用以下Qt nativeEvent
功能检测电源变化:
bool Test::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
Q_UNUSED(result);
Q_UNUSED(eventType);
MSG *msg = static_cast<MSG*>(message);
if (msg->message == WM_POWERBROADCAST && msg->wParam == PBT_APMPOWERSTATUSCHANGE) {
qDebug() << "Power changed!!!";
}
return false;
}
但是没有任何东西打印到控制台。任何想法如何检测它?谢谢。
更新时间:2019 年 2 月 3 日
我发现我需要使用HID API
来获取UPS
. 部分数值UPS
来自网络。
0x00840010 = UPS
0x00840012 = Battery
0x00840030 = Voltage
0x00840040 = ConfigVoltage
0x0084001a = Input
0x0084005a = AudibleAlarmControl
0x00840002 = PresentStatus
0x00850044 = Charging
0x00850045 = Discharging
0x008500d0 = ACPresent
更新代码:
QString devicePath = "\\\\?\\HID#VID_....";
HANDLE fileHandle = CreateFileA(devicePath.toStdString().c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (fileHandle != INVALID_HANDLE_VALUE) {
std::cout << "Success. Device opened for reading..." << std::endl;
PHIDP_PREPARSED_DATA preparsedData;
HIDP_CAPS capabilities;
HIDD_ATTRIBUTES attributes;
BOOL hidPreparsedRes = HidD_GetPreparsedData(fileHandle, &preparsedData);
if (hidPreparsedRes) {
if (HidD_GetAttributes(fileHandle, &attributes)) {
std::cout << "Product ID: " << attributes.ProductID << std::endl;
std::cout << "Size: " << attributes.Size << std::endl;
std::cout << "Vendor ID: " << attributes.VendorID << std::endl;
std::cout << "Version number: " << attributes.VersionNumber << std::endl;
if (HidP_GetCaps(preparsedData, &capabilities) == HIDP_STATUS_SUCCESS) {
std::cout << "Caps: " << capabilities.NumberOutputValueCaps << std::endl;
} else {
std::cout << "Failed to return HID capabilities!" << std::endl;
}
} else {
std::cout << "Failed to get HID attributes" << std::endl;
}
std::cout << getLastErrorAsString() << std::endl;
} else {
std::cout << "Failed to get preparsed data!" << std::endl;
}
HidD_FreePreparsedData(preparsedData);
} else {
std::cout << "Failed to open device for reading!" << std::endl;
}
CloseHandle(fileHandle);
所以现在,它返回:
成功。设备打开读取... 产品 ID:20833 大小:12 供应商 ID:1637 版本号:2 大写:1
HIDP_CAPS
结构有很多不同的值,问题是如何将它们转换为UPS
值以检查电源变化/UPS
状态?谢谢。
解决方案
推荐阅读
- dart - Dart中的'is'和'=='有什么区别?
- swift - 在 Swift 中,如果 Thread.current.isMainThread == false,那么递归一次 DispatchQueue.main.sync 是否安全?
- matlab - 难以从 url 的数据 webread 中绘制图表
- python - 如何在不使用 __str__ 方法的情况下从类中返回对象?
- java - 基于偏好的分组不断返回空值
- c - 将 For 循环更改为 While 循环
- fiware-orion - 使用 Docker-compose 安装的 Cygnus-ngsi 不会在 MongoDB 中保存数据
- scala - 完成 scala 承诺竞赛
- c++ - 有人可以帮我解释一下tic tac toe的一些代码行吗?
- nginx - 动态 URL 段的 Nginx 配置作为父段索引的参数