Подавление ввода с клавиатуры, когда модификатор удерживается с помощью pynput в Windows - PullRequest
0 голосов
/ 07 октября 2018

У меня есть простой скрипт, который ищет определенные комбинации клавиш.Когда они найдены, он записывает их в файл.Я использую `в качестве модификатора.Например, если я сделаю `+ x, то в файл будет записано" x ".

Моя проблема в том, что ввод с клавиатуры также отправляется в любое активное окно.Я не хочу этогоЯ просто хочу, чтобы ввод был отправлен в файл, когда `удерживается.Есть ли способ сделать это?

Редактировать: Я также был бы хорошо с перенаправлением нажатий клавиш в определенное окно, как Блокнот, открытый в фоновом режиме, если это будет проще.

Вот сценарий.Он использует Python3 в Windows.

import os

from pynput import keyboard

def main():
    filename = "log.txt"

    # The key combination to check
    COMBINATIONS = [
        # Alpha characters
        {keyboard.KeyCode(char="`"), keyboard.KeyCode(char='x')},
        {keyboard.KeyCode(char="`"), keyboard.KeyCode(char='X')}
    ]

    current = set()

    def execute(combo):
        command = []
        for item in combo:
            try:
                print(item.char)
                command.append(item.char)
            except AttributeError as e:
                print(item.name)
                command.append(item.name)
        command = [c for c in command if c != "`"]
        command = " ".join(sorted(command))
        print(command)

        fo = open(filename, "a+")
        fo.write("{}\n".format(command))

    def on_press(key):
        if any([key in COMBO for COMBO in COMBINATIONS]):
            current.add(key)
            if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
                print((k in current for k in COMBO) for COMBO in COMBINATIONS)
                execute(current)

    def on_release(key):
        if any([key in COMBO for COMBO in COMBINATIONS]):
            current.remove(key)

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

if __name__ == "__main__":
    main()

1 Ответ

0 голосов
/ 09 октября 2018

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

Редактировать:Вот пример сценария AHK. Я знаю, что этот ответ на самом деле не относится к разделу Python, но, надеюсь, он поможет всем, кто найдет это через Google:)

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

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.

SetWorkingDir C:\ahkscripts

; Use capslock as a toggle key
capslock::
    Suspend
return

; write "1" to a file. FileAppend will create the file if it doesn't exist
1::
    FileAppend, `n1, *myoutputfile.txt, 
return



; write alt+1 to a file
!1::
    FileAppend, `naltleft 1, *myoutputfile.txt, 
return


; write shift+1 to a file

+1::
    FileAppend, `nshiftleft 1, *myoutputfile.txt, 
return
...