You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:06:07