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

如何使用C语言检测Android设备屏幕的锁定/解锁状态

屏幕锁定状态属于上层图形服务的用户态状态,和硬件中断没有固定绑定关系,你监测/proc/interrupts的思路完全不可行,不同设备的唤醒中断还会关联其他硬件事件,无法通过该方式准确判断锁状态。

分平台C语言实现方案

Linux 桌面环境

  • X11显示协议下可调用XScreenSaver扩展API实现查询,需要先安装libxss-dev依赖,编译时添加-lX11 -lXss参数,核心是读取XScreenSaverInfo结构体的state字段,ScreenSaverOn对应锁定状态,ScreenSaverOff对应解锁状态。
  • GNOME桌面可通过DBus调用org.gnome.ScreenSaver接口的GetActive方法获取状态,C语言可使用libdbus库实现调用。
  • KDE桌面可通过DBus调用org.kde.screensaver接口的getActive方法获取状态。
  • Wayland环境无统一通用接口,需根据你使用的合成器(如Mutter、KWin)提供的专属DBus接口查询。

X11环境下示例代码

#include <X11/Xlib.h>
#include <X11/extensions/scrnsaver.h>
#include <stdio.h>

int main() {
    Display *dpy = XOpenDisplay(NULL);
    if (!dpy) {
        fprintf(stderr, "无法打开X11显示连接\n");
        return 1;
    }
    XScreenSaverInfo *ss_info = XScreenSaverAllocInfo();
    XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), ss_info);
    
    if (ss_info->state == ScreenSaverOn) {
        printf("当前屏幕已锁定\n");
    } else {
        printf("当前屏幕未锁定\n");
    }
    
    XFree(ss_info);
    XCloseDisplay(dpy);
    return 0;
}

编译指令:gcc check_lock.c -o check_lock -lX11 -lXss

Android 平台(Keyguard状态查询)

  • 可通过JNI调用Android框架KeyguardManager类的isKeyguardLocked()方法直接获取状态。
  • 原生层也可监听ACTION_SCREEN_ON/ACTION_SCREEN_OFF/ACTION_USER_PRESENT广播间接判断状态,注意不同Android版本对权限的限制要求。

Windows 平台

  • 可调用Win32 API的SystemParametersInfo函数,传入SPI_GETSCREENSAVERSECURE参数判断是否启用带密码的屏保,也可通过WTSQuerySessionInformation查询会话信息中的锁定状态字段。

内容的提问来源于stack exchange,提问作者ltx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:07