Получение системных нажатий клавиш с помощью Python - PullRequest
0 голосов
/ 27 июня 2019

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

command = "./STB_KEYCAP.sh"
popen = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
for stdout_line in iter(popen.stdout.readline, ""):
    stdout_line = stdout_line.decode("utf-8")[0]

    if stdout_line == "a":
        channelUp()
    elif stdout_line == "d":
        channelDown()

STB_KEYCAP.py:

xinput test-xi2 --root 3| grep -A2 --line-buffered RawKeyRelease | while read -r line ;
do 



    #Trim line down and remove non digits
    if [[ $line == *"detail"* ]];
    then
        key=$( echo $line | sed "s/[^0-9]*//g")

        if [[ $key == "38" ]];
        then
            echo "a"
        fi

        if [[ $key == "40" ]];
        then
            echo "d"
        fi

        if [[ $key == "42" ]];
        then
            echo "g"
        fi

        sleep 0
    fi
done

Опять же, это работает, но это занимает несколько секунддля того, чтобы принять меры.Любые советы о том, как переписать это, чтобы сделать это быстрее, было бы здорово!

1 Ответ

0 голосов
/ 28 июня 2019

Я закончил тем, что нашел решение, которое хорошо сработало для меня. Недостатком этого является то, что он требует запуска сценария с правами администратора, что не является проблемой в моем случае, но может не работать для некоторых целей. В итоге я проанализировал файл / dev / input для моей клавиатуры и определил нажатия клавиш на основе изменений. Это решение оказалось очень быстрым и дало хорошие результаты.

f = open( "/dev/input/event5", "rb" );
while 1:
    data = f.read(24)
    bytes = struct.unpack('4IHHI', data)
    value = str(bytes).split(", ")
    if value[6] == "0)":
        if value[5] != "0":



                # DO SOMETHING WITH KEY
...