recall

pip install opencv-python pynput
import cv2
from pynput import mouse, keyboard
import os
import time
import sys
import ctypes
import threading
import tkinter as tk

# 全局状态
monitoring_active = False
done = False
root = None
status_dot = None
timer_id = None 

def capture_and_lock_process():
    global done
    target_dir = r"D:\Desktop\wtf"
    if not os.path.exists(target_dir):
        os.makedirs(target_dir, exist_ok=True)

    # 第一张:预热并展示
    cap = cv2.VideoCapture(0)
    if cap.isOpened():
        for _ in range(30): cap.read()
        ret, frame = cap.read()
        if ret:
            p1 = os.path.join(target_dir, f"show_{time.strftime('%H%M%S')}.jpg")
            cv2.imwrite(p1, frame)
            os.startfile(p1)
            time.sleep(3)
        cap.release()

    # 第二张:静默捕获
    cap = cv2.VideoCapture(0)
    if cap.isOpened():
        for _ in range(10): cap.read()
        ret, frame = cap.read()
        if ret:
            p2 = os.path.join(target_dir, f"final_{time.strftime('%H%M%S')}.jpg")
            cv2.imwrite(p2, frame)
        cap.release()

    # 锁屏并退出
    ctypes.windll.user32.LockWorkStation()
    os._exit(0)

# --- 悬浮色点逻辑 ---

def hide_dot():
    global timer_id
    if root:
        root.withdraw()
    timer_id = None

def show_dot_temporarily():
    global timer_id
    if root and status_dot:
        if timer_id is not None:
            root.after_cancel(timer_id)
        
        color = "red" if monitoring_active else "green"
        status_dot.config(bg=color)
        root.deiconify()
        timer_id = root.after(3000, hide_dot)

def create_gui():
    global root, status_dot
    root = tk.Tk()
    root.overrideredirect(True)
    root.attributes("-topmost", True)
    root.geometry("15x15+10+10")
    
    status_dot = tk.Label(root, bg="green")
    status_dot.pack(expand=True, fill="both")
    
    root.withdraw()
    root.mainloop()

# --- 监听逻辑 ---

def toggle_monitoring():
    global monitoring_active
    monitoring_active = not monitoring_active
    show_dot_temporarily()

def force_exit():
    """强制退出程序"""
    print("\n[!] 收到退出指令,程序关闭。")
    os._exit(0)

def on_press(key):
    # F9 切换状态
    if key == keyboard.Key.f9:
        toggle_monitoring()
    
    # 强制退出:这里设置为 Shift + F8
    # 如果你坚持要单按 F8,就把 if 后的逻辑改为 key == keyboard.Key.f8
    if key == keyboard.Key.f8:
        force_exit()

def on_mouse_event(*args):
    global done, monitoring_active
    if monitoring_active and not done:
        done = True
        capture_and_lock_process()

def run_listeners():
    # 建立键盘监听
    k_listener = keyboard.Listener(on_press=on_press)
    # 建立鼠标监听
    m_listener = mouse.Listener(on_move=on_mouse_event, on_click=on_mouse_event)
    
    k_listener.start()
    m_listener.start()
    k_listener.join()

if __name__ == "__main__":
    # 启动监听线程
    threading.Thread(target=run_listeners, daemon=True).start()
    
    # 启动 GUI(主线程)
    create_gui()
posted @ 2026-03-24 21:47  codwarm  阅读(2)  评论(0)    收藏  举报