使用python程序加bat一键运行脚本,妈妈再也不用担心我的电脑桌面了
import os
import time
import cv2
import pyautogui
import psutil
from datetime import datetimeclass UnlockMonitor:def __init__(self):"""初始化监控器"""self.save_dir = os.path.dirname(os.path.abspath(__file__))self.log_file = os.path.join(self.save_dir, "unlock_capture_log.txt")self.last_state = self.is_locked()self.running = Truedef log_message(self, message):"""记录日志到文件和终端"""timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")log_entry = f"[{timestamp}] {message}"print(log_entry)try:with open(self.log_file, "a", encoding="utf-8") as f:f.write(log_entry + "\n")except Exception as e:print(f"[{timestamp}] 写入日志失败: {str(e)}")def is_camera_available(self):"""检查摄像头是否可用"""try:cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)if not cap.isOpened():return Falsecap.release()return Trueexcept Exception as e:self.log_message(f"摄像头检测异常: {str(e)}")return Falsedef capture_camera(self):"""直接拍照(不对图像做任何处理)"""timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")camera_path = os.path.join(self.save_dir, f"camera_{timestamp}.jpg")try:cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)cap.set(cv2.CAP_PROP_AUTOFOCUS, 1) time.sleep(2)if not cap.isOpened():self.log_message("无法打开摄像头")returnret, frame = cap.read()cap.release()if ret:cv2.imwrite(camera_path, frame)self.log_message(f"拍照保存至: {camera_path}")else:self.log_message("摄像头读取失败")except Exception as e:self.log_message(f"拍照异常: {str(e)}")def capture_screenshot(self):"""截屏"""timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")screenshot_path = os.path.join(self.save_dir, f"screenshot_{timestamp}.png")try:screenshot = pyautogui.screenshot()screenshot.save(screenshot_path)self.log_message(f"截屏保存至: {screenshot_path}")except Exception as e:self.log_message(f"截屏失败: {str(e)}")def is_already_running(self):"""检查是否已有相同进程在运行"""current_pid = os.getpid()script_name = os.path.basename(__file__)for proc in psutil.process_iter(['pid', 'name', 'cmdline']):try:if (proc.info['pid'] != current_pid and proc.info['cmdline'] and script_name in ' '.join(proc.info['cmdline'])):return Trueexcept (psutil.NoSuchProcess, psutil.AccessDenied, KeyError):continuereturn Falsedef is_locked(self):"""检查系统是否处于锁定状态"""try:for proc in psutil.process_iter(['name']):if proc.info['name'] == 'LogonUI.exe':return Truereturn Falseexcept Exception:return Falsedef run(self):"""主监控循环"""if self.is_already_running():self.log_message("已有实例运行,退出当前进程")returnself.log_message("===== 解锁监控服务启动 =====")self.log_message(f"初始状态: {'锁定' if self.last_state else '解锁'}")try:while self.running:current_state = self.is_locked()if self.last_state and not current_state:self.log_message("检测到解锁事件,开始捕获...")if self.is_camera_available():self.capture_camera()self.capture_screenshot()self.last_state = current_statetime.sleep(1) except KeyboardInterrupt:self.log_message("服务被用户中断")except Exception as e:self.log_message(f"服务异常: {str(e)}")finally:self.log_message("===== 监控服务停止 =====")if __name__ == '__main__':monitor = UnlockMonitor()monitor.run()
@echo off
chcp 65001 > nul
title 解锁拍照监控服务
color 0A:: 设置循环标志
set RESTART_COUNT=0:restart
echo 正在启动解锁拍照监控服务... (第%RESTART_COUNT%次启动)
echo 按 Ctrl+C 停止服务:: 设置Python路径(根据您的环境修改)
set PYTHON_PATH="C:\Users\lhyyds\.conda\envs\hust\python.exe":: 设置脚本路径
set SCRIPT_PATH="%~dp0wake_monitor.py":: 启动Python脚本
%PYTHON_PATH% %SCRIPT_PATH%:: 检查是否需要重启
set /a RESTART_COUNT+=1
echo 服务意外停止,5秒后自动重启...
timeout /t 5 /nobreak >nul
goto restartecho 服务已手动停止
pause