使用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 = True def 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 False cap. release( ) return True except Exception as e: self. log_message( f"摄像头检测异常: { str ( e) } " ) return False def 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( "无法打开摄像头" ) return ret, 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 True except ( psutil. NoSuchProcess, psutil. AccessDenied, KeyError) : continue return False def is_locked ( self) : """检查系统是否处于锁定状态""" try : for proc in psutil. process_iter( [ 'name' ] ) : if proc. info[ 'name' ] == 'LogonUI.exe' : return True return False except Exception: return False def run ( self) : """主监控循环""" if self. is_already_running( ) : self. log_message( "已有实例运行,退出当前进程" ) return self. 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\e nvs\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