Как сохранить нажатие клавиш клавиатуры с помощью pynput?

В настоящее время я работаю над скриптом Python типа кейлоггера, и у меня возникают проблемы с сохранением того, какие клавиши в любой момент удерживаются нажатыми.

Я написал этот небольшой фрагмент кода, чтобы продемонстрировать свою проблему:

from pynput.keyboard import Key, Listener
import time

def on_press(key):
    print(f'{key} pressed')
    
    if not key in keys_down:
        keys_down[key] = time.time()
    
    print(keys_down)

def on_release(key):
    print(f'{key} release')

    del keys_down[key]

    if key == Key.esc:
        return False

keys_down = dict()

with Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

Я хочу сохранить, какие клавиши клавиатуры нажимаются в данный момент в словаре keys_down.
Я также хочу знать, когда впервые была нажата определенная клавиша клавиатуры.
Поэтому пары ключ-значение моего словаря хранятся следующим образом:

keys_down = {
    keyboard key 1: timestamp when first pressed
    keyboard key 2: timestamp when first pressed
    ...
}

Когда клавиша клавиатуры отпущена, я удаляю пару ключ-значение с ключом, эквивалентным отпущенной клавише клавиатуры.
Надеюсь, это предложение имело смысл.
Проблема возникает при использовании быстрого доступа crtl.
Иногда клавиша клавиатуры, выводимая при нажатии, отличается от той же клавиши клавиатуры, выводимой при отпускании. Из-за этого del-функция выдает ошибку, поэтому она пытается удалить несуществующий пар ключ-значение.

Я очень надеюсь, что вы поможете мне обойти эту проблему. Хорошего дня :)


person pluto9800    schedule 14.01.2021    source источник
comment
Как насчет того, чтобы просто перехватить исключение KeyError из неудачной операции del с помощью блока try/except?   -  person larsks    schedule 14.01.2021
comment
Да, но тогда у меня останутся остатки в словаре keys_down. Когда ключ отпущен, он не будет удален из диктофона.   -  person pluto9800    schedule 15.01.2021


Ответы (1)


Это неудовлетворительный ответ, но код работает при установке более старой версии pynput (1.4). В этой версии клавиши хранятся не как странные шестнадцатеричные значения, а вместо этого нажимаемые клавиши

person pluto9800    schedule 15.01.2021