Windows平台下如何用C++获取笔记本电脑当前顶盖开合状态
C++ 一次性查询笔记本顶盖开合状态实现方案
该功能属于平台相关能力,C++标准库没有提供通用接口,以下分别给出三大主流桌面操作系统的实现方式,均为单次同步查询逻辑,无事件监听逻辑。
Windows 平台
依赖Win32 API,需要链接powrprof.lib库,调用CallNtPowerInformation接口查询:
#include <windows.h> #include <powerbase.h> #include <iostream> enum LidState { LID_OPEN, LID_CLOSED, LID_QUERY_FAILED }; LidState getCurrentLidState() { SYSTEM_POWER_INFORMATION spi; NTSTATUS status = CallNtPowerInformation( SystemPowerInformation, NULL, 0, &spi, sizeof(spi) ); if (status != 0) return LID_QUERY_FAILED; return spi.LidState ? LID_CLOSED : LID_OPEN; } int main() { LidState state = getCurrentLidState(); switch(state) { case LID_OPEN: std::cout << "顶盖已打开" << std::endl; break; case LID_CLOSED: std::cout << "顶盖已合上" << std::endl; break; default: std::cout << "查询顶盖状态失败" << std::endl; } return 0; }
编译参数说明:MinGW环境添加-lpowrprof,Visual Studio环境将powrprof.lib添加到附加依赖项即可。
Linux 平台
直接读取sysfs下的系统文件即可,无需额外依赖,绝大多数主流笔记本的状态文件路径为/proc/acpi/button/lid/LID0/state:
#include <fstream> #include <string> #include <iostream> enum LidState { LID_OPEN, LID_CLOSED, LID_QUERY_FAILED }; LidState getCurrentLidState() { std::ifstream lidFile("/proc/acpi/button/lid/LID0/state"); if (!lidFile.is_open()) return LID_QUERY_FAILED; std::string content; std::getline(lidFile, content); if (content.find("open") != std::string::npos) return LID_OPEN; if (content.find("closed") != std::string::npos) return LID_CLOSED; return LID_QUERY_FAILED; } int main() { LidState state = getCurrentLidState(); switch(state) { case LID_OPEN: std::cout << "顶盖已打开" << std::endl; break; case LID_CLOSED: std::cout << "顶盖已合上" << std::endl; break; default: std::cout << "查询顶盖状态失败" << std::endl; } return 0; }
如果查询失败可以检查/proc/acpi/button/lid/目录下的实际LID设备名,替换代码中的LID0即可。
macOS 平台
依赖IOKit框架,调用IOPMCopyLidState接口查询,编译时需要链接IOKit框架:
#include <IOKit/pwr_mgt/IOPMLib.h> #include <iostream> enum LidState { LID_OPEN, LID_CLOSED, LID_QUERY_FAILED }; LidState getCurrentLidState() { kern_return_t kr; bool lidClosed; kr = IOPMCopyLidState(&lidClosed); if (kr != KERN_SUCCESS) return LID_QUERY_FAILED; return lidClosed ? LID_CLOSED : LID_OPEN; } int main() { LidState state = getCurrentLidState(); switch(state) { case LID_OPEN: std::cout << "顶盖已打开" << std::endl; break; case LID_CLOSED: std::cout << "顶盖已合上" << std::endl; break; default: std::cout << "查询顶盖状态失败" << std::endl; } return 0; }
编译时添加参数:-framework IOKit。
内容的提问来源于stack exchange,提问作者Hrach Martirosyan
相关产品推荐
相关产品推荐

