ScreenLockDetector/README.md

451 lines
11 KiB
Markdown
Raw Normal View History

2025-11-07 10:56:45 +08:00
# Qt Screen Lock Detection Demo
一个基于 Qt5 + CMake 的跨平台应用程序,用于检测系统的锁屏状态,并在锁屏时自动停止所有 Paint 事件。
**支持平台:**
-**Linux** (Ubuntu, Deepin, Fedora 等)
-**macOS** (10.12 及以上版本)
2025-11-07 10:56:45 +08:00
## 功能特性
2025-11-11 20:49:12 +08:00
-**自动检测锁屏/休眠/睡眠状态**
- Linux: 通过 DBus 监听系统的锁屏/解锁事件
- macOS: 通过 NSDistributedNotificationCenter 监听系统通知
2025-11-07 10:56:45 +08:00
-**自动停止绘制**:屏幕锁定时自动停止所有 Paint 事件,节省系统资源
-**实时动画演示**:持续的动画效果,直观展示绘制的启用/禁用状态
-**手动控制**:提供手动启用/禁用绘制的按钮
-**状态监控**:实时显示锁屏状态、绘制状态和帧数统计
-**多平台支持**
- Linux: 支持 GNOME、KDE、XFCE、Deepin DDE 等主流桌面环境
- macOS: 原生系统通知支持
2025-11-07 10:56:45 +08:00
## 技术架构
### 核心组件
1. **ScreenLockDetector** - 跨平台锁屏检测器
- **Linux**: 通过 Qt DBus 监听系统锁屏信号
- 支持 GNOME ScreenSaver、systemd-logind 和 Deepin DDE 接口
- **macOS**: 通过 NSDistributedNotificationCenter 监听系统通知
- 监听 com.apple.screenIsLocked/Unlocked 通知
2025-11-07 10:56:45 +08:00
- 发出锁屏/解锁信号供其他组件订阅
2. **CustomWidget** - 自定义绘制组件
- 实现了动态动画效果(旋转圆圈、波浪效果等)
- 60 FPS 刷新率
- 可控制的绘制启用/禁用状态
- 帧数统计功能
3. **MainWindow** - 主窗口
- 整合各个组件
- 提供用户界面和控制面板
- 实时状态显示
### 技术栈
- **语言**C++11 / Objective-C++ (macOS)
- **GUI 框架**Qt 5.15.2 (或更高版本)
2025-11-07 10:56:45 +08:00
- **构建系统**CMake 3.10+
- **系统接口**
- Linux: Qt DBus
- macOS: Foundation Framework (NSDistributedNotificationCenter)
- **平台**Linux Ubuntu / macOS 10.12+
2025-11-07 10:56:45 +08:00
## 系统要求
### Linux
- Linux Ubuntu 18.04 或更高版本(也支持 Deepin OS、Fedora 等)
- Qt 5.15.2 或更高版本
2025-11-07 10:56:45 +08:00
- CMake 3.10 或更高版本
- GCC/G++ 编译器(支持 C++11
- DBus 系统服务
### macOS
- macOS 10.12 (Sierra) 或更高版本
- Qt 5.15.2 或更高版本(可通过 Homebrew 安装)
- CMake 3.10 或更高版本
- Xcode Command Line Tools
- Foundation 和 Cocoa 框架(系统自带)
2025-11-07 10:56:45 +08:00
## 安装与编译
### macOS 平台
#### 1. 安装依赖
使用 Homebrew 安装 Qt5
2025-11-07 10:56:45 +08:00
```bash
# 安装 Homebrew如果尚未安装
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装 Qt5
brew install qt@5
# 安装 CMake如果尚未安装
brew install cmake
2025-11-07 10:56:45 +08:00
```
或者从 Qt 官网下载安装器https://www.qt.io/download
2025-11-07 10:56:45 +08:00
#### 2. 编译项目
```bash
# 赋予脚本执行权限
chmod +x build_mac.sh run_mac.sh
# 编译
./build_mac.sh
2025-11-07 10:56:45 +08:00
```
脚本会自动搜索 Qt 安装路径。如果需要手动指定,可以设置环境变量:
```bash
export Qt5_DIR=/path/to/qt/lib/cmake/Qt5
./build_mac.sh
```
### Linux 平台
#### 1. 确保 Qt5 已安装
```bash
# Ubuntu/Debian
sudo apt-get install qt5-default qtbase5-dev libqt5dbus5
# Fedora
sudo dnf install qt5-qtbase-devel qt5-qtbase-gui
# 或使用自定义安装的 Qt
ls $HOME/sdk/qt-5.15.2
```
如果 Qt5 安装在其他位置,请修改 `CMakeLists.txt` 中的 Qt5_DIR 路径或设置环境变量。
#### 2. 赋予脚本执行权限
2025-11-07 10:56:45 +08:00
```bash
chmod +x build.sh run.sh
```
#### 3. 编译项目
2025-11-07 10:56:45 +08:00
```bash
./build.sh
```
编译成功后,可执行文件将生成在 `build/bin/ScreenLockDetector`
2025-11-07 10:56:45 +08:00
## 运行应用
### macOS 平台
#### 方法 1使用运行脚本推荐
```bash
./run_mac.sh
```
#### 方法 2直接运行可执行文件
```bash
./build/bin/ScreenLockDetector
```
#### 方法 3手动设置环境变量并运行
```bash
export DYLD_LIBRARY_PATH=/path/to/qt/lib:$DYLD_LIBRARY_PATH
./build/bin/ScreenLockDetector
```
### Linux 平台
#### 方法 1使用运行脚本推荐
2025-11-07 10:56:45 +08:00
```bash
./run.sh
```
#### 方法 2直接运行可执行文件
2025-11-07 10:56:45 +08:00
```bash
cd build/bin
./ScreenLockDetector
2025-11-07 10:56:45 +08:00
```
#### 方法 3手动设置环境变量并运行
2025-11-07 10:56:45 +08:00
```bash
export LD_LIBRARY_PATH=$HOME/sdk/qt-5.15.2/lib:$LD_LIBRARY_PATH
./build/bin/ScreenLockDetector
2025-11-07 10:56:45 +08:00
```
## 使用说明
1. **启动应用**:运行应用后,会看到一个带有动态动画的窗口
2. **测试锁屏检测**
- **macOS**: 使用快捷键 `Ctrl + Cmd + Q` 或从菜单栏选择"锁定屏幕"
- **Linux**: 使用快捷键 `Ctrl + Alt + L``Super + L`
2025-11-07 10:56:45 +08:00
- 观察动画是否停止
- 解锁后动画应自动恢复
3. **查看状态信息**
- **Detector Status**:检测器是否正常工作
- **Screen Lock Status**:当前屏幕锁定状态(🔒 LOCKED / 🔓 UNLOCKED
- **Painting Status**:绘制是否启用(✓ ENABLED / ✗ DISABLED
- **Frame Count**:已绘制的总帧数
4. **手动控制**(可选):
- **Enable Painting**:手动启用绘制
- **Disable Painting**:手动禁用绘制
- **Reset Frame Count**:重置帧数计数器
## 工作原理
### Linux: DBus 监听机制
2025-11-07 10:56:45 +08:00
应用程序通过 Qt DBus 连接到 Linux 系统的锁屏服务:
2025-11-07 14:57:13 +08:00
1. **Deepin DDE 接口**Deepin OS
```
Service: com.deepin.dde.lockFront
Path: /com/deepin/dde/lockFront
Interface: com.deepin.dde.lockFront
2025-11-10 10:34:04 +08:00
Signals: Visible(bool)
2025-11-07 14:57:13 +08:00
```
2. **GNOME ScreenSaver 接口**
2025-11-07 10:56:45 +08:00
```
Service: org.gnome.ScreenSaver
Path: /org/gnome/ScreenSaver
Interface: org.gnome.ScreenSaver
Signal: ActiveChanged(bool)
```
2025-11-10 10:34:04 +08:00
3. **KylinOS UKUI接口**
2025-11-07 10:56:45 +08:00
```
2025-11-10 10:34:04 +08:00
Service: org.ukui.ScreenSaver
Path: /
Interface: org.ukui.ScreenSaver
Signals: lock(), unlock()
2025-11-07 10:56:45 +08:00
```
### macOS: 分布式通知中心
应用程序通过 NSDistributedNotificationCenter 监听 macOS 系统通知:
1. **屏幕锁定通知**
```
Notification: com.apple.screenIsLocked
当用户锁定屏幕时发送
```
2. **屏幕解锁通知**
```
Notification: com.apple.screenIsUnlocked
当用户解锁屏幕时发送
```
3. **屏幕保护程序通知**(辅助检测)
```
2025-11-11 20:49:12 +08:00
Notifications:
- com.apple.screensaver.didstart
- com.apple.screensaver.didstop
```
2025-11-07 10:56:45 +08:00
### Paint 事件控制
当检测到锁屏时:
1. `ScreenLockDetector` 发出 `screenLocked()` 信号
2. `MainWindow` 接收信号并调用 `CustomWidget::setPaintingEnabled(false)`
3. `CustomWidget` 停止动画定时器
4. `paintEvent()` 检查启用状态,不再绘制动画内容
当检测到解锁时:
1. `ScreenLockDetector` 发出 `screenUnlocked()` 信号
2. `MainWindow` 调用 `CustomWidget::setPaintingEnabled(true)`
3. `CustomWidget` 重启动画定时器
4. 动画恢复正常绘制
## 项目结构
```
ScreenLockDetector/
├── CMakeLists.txt # CMake 构建配置(跨平台)
2025-11-07 10:56:45 +08:00
├── README.md # 项目文档
├── build.sh # Linux 编译脚本
├── run.sh # Linux 运行脚本
├── build_mac.sh # macOS 编译脚本
├── run_mac.sh # macOS 运行脚本
2025-11-07 10:56:45 +08:00
└── src/
├── main.cpp # 程序入口
├── mainwindow.h # 主窗口头文件
├── mainwindow.cpp # 主窗口实现
├── screenlockdetector.h # 跨平台锁屏检测器头文件
├── screenlockdetector.cpp # 跨平台锁屏检测器实现
├── screenlockdetector_mac.h # macOS 特定实现头文件
├── screenlockdetector_mac.mm # macOS 特定实现Objective-C++
├── customwidget.h # 自定义组件头文件
└── customwidget.cpp # 自定义组件实现
2025-11-07 10:56:45 +08:00
```
## 故障排除
### macOS 平台
#### 问题 1应用无法检测到锁屏
**可能原因**
- 权限问题
- 系统通知未正常工作
**解决方案**
```bash
# 查看应用日志
./run_mac.sh 2>&1 | grep "ScreenLock"
# 检查系统完整性保护SIP状态
csrutil status
# 确保应用有必要的权限
```
#### 问题 2编译错误 - Qt5 not found
**解决方案**
```bash
# 使用 Homebrew 安装 Qt5
brew install qt@5
# 设置 Qt5_DIR 环境变量
export Qt5_DIR=$(brew --prefix qt@5)/lib/cmake/Qt5
./build_mac.sh
```
#### 问题 3运行时找不到 Qt 库
**解决方案**
```bash
# 设置 DYLD_LIBRARY_PATH
export DYLD_LIBRARY_PATH=$(brew --prefix qt@5)/lib:$DYLD_LIBRARY_PATH
# 或使用 run_mac.sh 脚本(已包含此配置)
./run_mac.sh
```
### Linux 平台
#### 问题 1锁屏检测不工作
2025-11-07 10:56:45 +08:00
**可能原因**
- DBus 服务未运行
- 桌面环境不支持标准 DBus 接口
- 权限不足
**解决方案**
```bash
# 检查 DBus 服务
ps aux | grep dbus
# 检查 GNOME ScreenSaver 是否可用
qdbus org.gnome.ScreenSaver
# 查看应用日志输出,确认连接状态
```
### 问题 2编译错误 - Qt5 not found
**解决方案**
1. 确认 Qt5 安装路径:`ls $HOME/sdk/qt-5.15.2`
2. 修改 `CMakeLists.txt` 中的 Qt5_DIR 路径
3. 或设置环境变量:`export Qt5_DIR=$HOME/sdk/qt-5.15.2/lib/cmake/Qt5`
### 问题 3运行时找不到 Qt 库
**解决方案**
```bash
# 设置 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=$HOME/sdk/qt-5.15.2/lib:$LD_LIBRARY_PATH
# 或使用 run.sh 脚本(已包含此配置)
./run.sh
```
### 问题 4警告 - Failed to connect to screen lock detection service
**说明**:这是正常的,表示某些 DBus 接口在当前桌面环境中不可用。只要至少有一个接口连接成功,应用就能正常工作。
## 调试模式
应用程序会在控制台输出详细的调试信息:
```bash
# 运行并查看详细日志
./run.sh 2>&1 | tee app.log
# 查看特定类别的日志
./run.sh 2>&1 | grep "ScreenLockDetector"
```
## 扩展与定制
### 添加更多动画效果
`customwidget.cpp` 中的 `drawBackground()`, `drawRotatingCircles()`, `drawWaveEffect()` 等方法中添加自定义绘制代码。
### 支持其他桌面环境
`screenlockdetector.cpp` 中添加更多 DBus 接口连接:
```cpp
bool ScreenLockDetector::connectToKDEScreenSaver()
{
// 添加 KDE Plasma 锁屏检测支持
// Service: org.kde.screensaver
// ...
}
```
### 性能优化
调整动画刷新率(当前为 60 FPS
```cpp
// 在 customwidget.cpp 构造函数中
m_animationTimer->start(33); // 30 FPS (1000/30 ≈ 33ms)
```
## 许可证
本项目仅用于学习和演示目的。
## 作者
Qt Screen Lock Detection Demo
## 更新日志
### v2.0.0 (2024)
-**重大更新**: 新增 macOS 平台支持
- ✅ 实现跨平台架构Linux + macOS
- ✅ macOS: 使用 NSDistributedNotificationCenter 监听系统通知
- ✅ 创建平台特定的构建和运行脚本
- ✅ 更新文档,包含 macOS 使用说明
2025-11-07 14:57:13 +08:00
### v1.1.0 (2024)
- ✅ 新增 Deepin OS (DDE) 锁屏检测支持
- ✅ 优化多桌面环境兼容性
2025-11-07 10:56:45 +08:00
### v1.0.0 (2024)
- ✅ 初始版本发布
- ✅ 支持 GNOME 和 systemd-logind 锁屏检测
- ✅ 实现自动 Paint 事件控制
- ✅ 提供丰富的动画演示效果
- ✅ 完整的状态监控和手动控制界面
## 反馈与贡献
2025-11-10 10:34:04 +08:00
如有问题或建议,欢迎提出!