# 自动锁屏解锁 **Repository Path**: null_465_7266/auto-lock--unlock ## Basic Information - **Project Name**: 自动锁屏解锁 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-22 - **Last Updated**: 2026-05-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 为什么开发 我本人其实是不爱设置密码的,密码固然好,用起来麻烦,不设置密码又有人偷窥我的电脑 因此我萌生了开发一个防偷窥的技术 所以我想开发一个动态锁,我来电脑自动解锁,人离开就自动加锁,这样我就不需要每次来电脑都设置密码了。 尽量不要引入新的硬件 技术难点1 手机蓝牙检测想法好但是连接不稳定 人脸实现太复杂 手机和电脑间无法定位 暂时发现了替代品,不开发了 所有技术的实现方法和可能性 # 动态锁技术方案全景分析 ## 核心思路 ``` 检测"你在不在" → 在:解锁 / 不在:加锁 ``` --- ## 一、检测技术清单 ### 📱 方案一:手机蓝牙感应(推荐首选) | 项目 | 详情 | |------|------| | **原理** | 电脑持续扫描你手机的蓝牙信号,信号强→你在,信号消失→你离开 | | **所需硬件** | 无(现代电脑几乎都有蓝牙) | | **实现难度** | ⭐⭐ 低 | | **可靠性** | ⭐⭐⭐⭐ 高 | | **缺点** | 手机没电/蓝牙关闭会误锁;蓝牙信号有穿墙问题 | ``` 技术实现路径: Windows → 读取蓝牙设备RSSI信号强度 macOS → CoreBluetooth框架 Linux → bluetoothctl / PyBluez库 ``` --- ### 👁️ 方案二:摄像头人脸检测(无需识别,只需检测) | 项目 | 详情 | |------|------| | **原理** | 摄像头检测画面中"有没有人脸",不做身份识别 | | **所需硬件** | 笔记本自带摄像头即可 | | **实现难度** | ⭐⭐ 低 | | **可靠性** | ⭐⭐⭐ 中(光线影响大) | | **缺点** | 暗光环境失效;侧脸/遮挡可能误判;耗电 | ``` 技术实现路径: OpenCV → cv2.CascadeClassifier(Haar人脸检测) MediaPipe → 谷歌轻量级人脸检测 资源占用:CPU 5-15% ``` --- ### 🖱️ 方案三:输入设备活跃度检测 | 项目 | 详情 | |------|------| | **原理** | 监控鼠标/键盘最后活跃时间,超过N秒无操作→锁定 | | **所需硬件** | 无 | | **实现难度** | ⭐ 极低 | | **可靠性** | ⭐⭐ 低(看视频/文档时也会误锁) | | **缺点** | 本质是"超时锁屏",不是真正的离开检测 | ``` 注:这其实就是系统自带的屏保锁屏功能的增强版 适合作为其他方案的兜底补充 ``` --- ### 📶 方案四:WiFi/手机热点感应 | 项目 | 详情 | |------|------| | **原理** | 检测手机连接的WiFi或手机热点的MAC地址是否在局域网内 | | **所需硬件** | 无 | | **实现难度** | ⭐⭐ 低 | | **可靠性** | ⭐⭐⭐ 中 | | **缺点** | 延迟大(几十秒);WiFi断连不代表人离开 | ``` 技术实现路径: ping 手机IP 或 检测ARP表中手机MAC地址 局限:手机需保持WiFi连接且不休眠 ``` --- ### 🎵 方案五:超声波/音频检测(冷门但有趣) | 项目 | 详情 | |------|------| | **原理** | 扬声器发出人耳听不见的超声波,麦克风接收反射波判断是否有人在前方 | | **所需硬件** | 无(用内置扬声器+麦克风) | | **实现难度** | ⭐⭐⭐⭐⭐ 极高 | | **可靠性** | ⭐⭐ 低(需大量调试) | | **缺点** | 技术复杂,干扰因素多,几乎没有现成库 | ``` 参考:微软Surface曾用此技术(Presence Sensing) 个人实现门槛极高,不推荐 ``` --- ### 🪟 方案六:Windows Hello / 系统原生方案 | 项目 | 详情 | |------|------| | **原理** | 利用系统已有的生物识别+动态锁功能 | | **所需硬件** | 支持Win Hello的摄像头(红外)或指纹 | | **实现难度** | ⭐ 极低(系统设置即可) | | **可靠性** | ⭐⭐⭐⭐⭐ 极高 | | **缺点** | Windows独占;需要特定硬件支持 | ``` Windows设置 → 账户 → 登录选项 → 动态锁 配合蓝牙手机,系统原生支持! ⚠️ 可能你想要的功能系统已经有了 ``` --- ## 二、解锁技术清单 > 检测到"你回来了"之后,怎么自动解锁 | 解锁方式 | 原理 | 难度 | 安全性 | |----------|------|------|--------| | **免密码直接解锁** | 检测到你在→直接解除锁定 | ⭐ | ⭐⭐ | | **人脸识别解锁** | OpenCV/FR库识别你的脸 | ⭐⭐⭐ | ⭐⭐⭐⭐ | | **蓝牙设备确认解锁** | 特定手机蓝牙到达→解锁 | ⭐⭐ | ⭐⭐⭐ | | **PIN码降级** | 锁定时只需PIN而非复杂密码 | ⭐ | ⭐⭐⭐ | --- ## 三、方案组合推荐 ### 🥇 最推荐:蓝牙 + 系统动态锁 ``` 如果你用Windows 10/11: 设置 → 账户 → 登录选项 → 动态锁 手机与电脑配对蓝牙 手机离开蓝牙范围 → 自动锁屏 ✅ 零开发,系统原生,今天就能用 ``` ### 🥈 自己开发:蓝牙RSSI + 摄像头人脸检测双重验证 ``` 架构设计: [蓝牙扫描线程] ──→ 信号强度 > 阈值? ↓ 是 [摄像头线程] ──→ 检测到人脸? ↓ 是 保持解锁状态 任一条件不满足 → 触发锁屏 ``` ### 🥉 最简实现:摄像头人脸检测(纯软件) ```python # 伪代码框架 import cv2, time, subprocess face_cascade = cv2.CascadeClassifier('haarcascade_frontalface.xml') cap = cv2.VideoCapture(0) no_face_count = 0 while True: ret, frame = cap.read() faces = face_cascade.detectMultiScale(frame) if len(faces) == 0: no_face_count += 1 if no_face_count > 30: # 连续30帧没人 lock_screen() # 调用系统锁屏 else: no_face_count = 0 time.sleep(0.1) ``` --- ## 四、完整难度对比表 | 方案 | 开发难度 | 可靠性 | 资源占用 | 需要新硬件 | 推荐指数 | |------|---------|--------|---------|-----------|---------| | 系统原生动态锁(Win) | ⭐ | ⭐⭐⭐⭐⭐ | 极低 | ❌ | 🌟🌟🌟🌟🌟 | | 蓝牙RSSI检测 | ⭐⭐ | ⭐⭐⭐⭐ | 低 | ❌ | 🌟🌟🌟🌟 | | 摄像头人脸检测 | ⭐⭐ | ⭐⭐⭐ | 中 | ❌ | 🌟🌟🌟🌟 | | WiFi设备检测 | ⭐⭐ | ⭐⭐ | 低 | ❌ | 🌟🌟🌟 | | 输入活跃度 | ⭐ | ⭐⭐ | 极低 | ❌ | 🌟🌟 | | 超声波检测 | ⭐⭐⭐⭐⭐ | ⭐⭐ | 高 | ❌ | 🌟 | --- ## 五、建议的行动路径 ``` 第一步:先试系统原生功能 Windows动态锁 + 手机蓝牙配对 → 如果满足需求,直接结束 第二步:如果要自己开发 用Python实现蓝牙RSSI检测 + OpenCV人脸检测作为辅助验证 → 两个信号融合,减少误判 第三步:解锁策略 不建议完全无密码 建议:锁定时显示PIN输入框(4位数字) 而不是完整密码,平衡安全和便利 ``` --- **你想从哪个方向深入?我可以提供具体的代码实现。** 我先选择蓝牙RSSI检测 # 自动解锁实现方案 ## 核心问题 ``` 锁屏后 → 系统处于登录界面 → 你的程序已经"死了" 程序无法在锁屏界面运行并自动输入密码 ``` --- ## 一、问题本质分析 ``` ┌─────────────────────────────────────┐ │ 正常运行状态 │ │ 你的检测程序 ✅ 运行中 │ │ 检测到你离开 → 调用系统锁屏 ✅ 容易 │ └─────────────────┬───────────────────┘ │ 锁屏后 ↓ ┌─────────────────────────────────────┐ │ 锁屏/登录界面 │ │ 你的程序 ❌ 已挂起或无权限 │ │ 无法操作登录界面 ❌ 难 │ └─────────────────────────────────────┘ ``` --- ## 二、可行的解锁方案 ### 🥇 方案一:根本不锁屏,用"遮挡"代替锁屏 > **最推荐,绕过问题本身** ``` 思路: 不调用真正的系统锁屏 而是自己的程序全屏覆盖屏幕 程序本身一直在后台运行 检测到你回来 → 直接关闭遮挡窗口 ┌─────────────────┐ │ ██████████████ │ ← 你的全屏遮挡窗口 │ ██ 已离开 ████ │ (黑屏/模糊/自定义界面) │ ██████████████ │ └─────────────────┘ ↓ 检测到你回来 ┌─────────────────┐ │ 正常桌面显示 │ ← 直接显示,无需密码 └─────────────────┘ ``` **实现代码框架(Python):** ```python import tkinter as tk import threading import cv2 class FakeLocker: def __init__(self): self.locked = False self.root = None def show_lock_screen(self): """显示全屏遮挡""" self.root = tk.Tk() self.root.attributes('-fullscreen', True) self.root.attributes('-topmost', True) # 始终最顶层 self.root.configure(bg='black') self.root.overrideredirect(True) # 无边框无标题栏 # 禁用所有快捷键(防止Alt+F4等) self.root.bind('', lambda e: None) self.root.bind('', lambda e: None) label = tk.Label(self.root, text="🔒 离开保护中", fg='white', bg='black', font=('Arial', 30)) label.pack(expand=True) self.locked = True self.root.mainloop() def unlock(self): """解除遮挡""" if self.root and self.locked: self.root.quit() self.root.destroy() self.locked = False locker = FakeLocker() ``` **优缺点:** | 优点 | 缺点 | |------|------| | 解锁完全自由,无需密码 | 强制结束任务管理器可绕过 | | 程序始终运行 | 安全性低于真正锁屏 | | 实现简单 | 需要防止快捷键绕过 | --- ### 🥈 方案二:Windows系统级服务(真正锁屏+自动解锁) > **真正的系统锁屏,技术难度高** ``` 原理: 以 SYSTEM 权限运行服务 在 Winlogon 进程层面操作 检测到你回来 → 调用 Windows 凭据API 自动登录 涉及技术: ├── Windows Service(系统服务,开机自启,高权限) ├── Winlogon Notification(登录通知接口) ├── CredentialProvider(凭据提供程序) └── SSPI / LSA(本地安全认证) ``` **实现路径:** ``` ┌─────────────────────────────────────────┐ │ Windows Service(SYSTEM权限) │ │ ├── 持续运行,不受锁屏影响 │ │ ├── 蓝牙/摄像头检测线程 │ │ └── 检测到用户回来 │ │ ↓ │ │ 调用 WTSConnectSession() │ │ 或 自定义CredentialProvider自动填密码 │ └─────────────────────────────────────────┘ ``` ```csharp // C# 实现 Windows Service 骨架 public class DynamicLockService : ServiceBase { protected override void OnStart(string[] args) { // 启动检测线程 Thread detectionThread = new Thread(DetectionLoop); detectionThread.IsBackground = true; detectionThread.Start(); } private void DetectionLoop() { while (true) { bool userPresent = CheckUserPresence(); // 你的检测逻辑 if (!userPresent && !IsLocked()) { LockWorkstation(); // kernel32.dll } else if (userPresent && IsLocked()) { AutoUnlock(); // 难点在这里 } Thread.Sleep(1000); } } [DllImport("user32.dll")] static extern bool LockWorkstation(); } ``` **自动解锁的具体障碍:** ``` 问题1:锁屏界面是独立的 Secure Desktop 普通程序无法向其发送输入 问题2:即使是SYSTEM权限 也不能直接"绕过"登录验证 问题3:微软故意设计为安全边界 合法途径只有 CredentialProvider ``` --- ### 🥉 方案三:修改登录方式为无密码(最简单粗暴) ``` 思路: 账户本身不设密码 锁屏后点击头像即可直接登录 你的程序只需要:模拟点击登录按钮 Windows无密码账户 + 自动点击登录 = 自动解锁 ``` ```python # 使用 pyautogui 在锁屏界面模拟操作 # 但需要程序有权限在锁屏桌面运行 import pyautogui import time def auto_login_no_password(): # 模拟按回车/点击登录(无密码账户) pyautogui.press('enter') # 或者点击特定坐标 pyautogui.click(960, 540) ``` **问题:** pyautogui在锁屏的Secure Desktop下无效 --- ### 💡 方案四:混合方案(推荐自己开发) ``` ┌──────────────────────────────────────────┐ │ 实际可行架构 │ ├──────────────────────────────────────────┤ │ │ │ [检测层] 蓝牙/摄像头 → 判断你在不在 │ │ ↓ │ │ [你在] ──────────────→ 无操作 │ │ │ │ [你离开] ────────────→ 启动遮挡程序 │ │ 全屏黑屏 │ │ 置顶+防快捷键 │ │ ↓ │ │ [你回来] ────────────→ 关闭遮挡程序 │ │ 桌面直接显示 │ │ │ │ [兜底] 真正离开超过10分钟 → 真正锁屏 │ │ (需要密码,但这是最后防线) │ └──────────────────────────────────────────┘ ``` --- ## 三、安全性对比 | 方案 | 对抗鼠标键盘 | 对抗截图窥视 | 对抗强制关进程 | 对抗重启 | |------|------------|------------|--------------|---------| | 遮挡窗口 | ✅ | ✅ | ❌ | ❌ | | 遮挡+防任务管理器 | ✅ | ✅ | ⚠️ | ❌ | | 系统真锁屏 | ✅ | ✅ | ✅ | ✅ | | 混合方案 | ✅ | ✅ | ⚠️ | ⚠️ | --- ## 四、我的建议 ``` 你的需求场景:防止同事/室友短暂偷窥 不是:防止专业攻击者 因此: ✅ 遮挡方案 完全够用 实现简单,自动解锁完美实现 对付普通偷窥 100% 有效 ✅ 加上兜底:超过5分钟调用真正系统锁屏 两层保护 ❌ 不需要 系统级服务方案 开发复杂度高10倍,收益有限 ``` --- ## 下一步 **你想要我提供哪个的完整代码?** - [ ] A:全屏遮挡程序(Python,今天就能跑) - [ ] B:蓝牙检测 + 遮挡联动完整版 - [ ] C:摄像头检测 + 遮挡联动完整版 - [ ] D:三合一完整项目(蓝牙+摄像头+遮挡)