pynput拒绝输入当终端不集中时



我有一个Python图形应用程序,该应用程序在终端中运行,并使用PYNPUT模块接受键盘输入。我遇到的问题是,即使我的窗口管理器未关注运行应用程序的终端,Pynput一直接受输入。这使得在不小心输入应用程序的情况下将重点转移到另一个任务。

理想情况下,我想能够:

  1. 当终端不在焦点中时,有pynput拒绝输入

  1. 有某种确定应用程序何时获得/失去焦点的方法(我可以模拟#1自己)

我已经搜索了pynput文档,但是我找不到解决方案。关于如何实现这一目标的任何建议将不胜感激。我正在使用Linux。

import time
from threading import Thread
from pynput import keyboard
from win32gui import GetWindowText, GetForegroundWindow
class KeyLogger:
    def __init__(self) -> None:
        self.is_paused=False  # pause keylog listener
        self.is_closed=False  # stop and close keylog
        self.l=None  # listener
        self.listened_window=GetWindowText(GetForegroundWindow())  # set listened window name
        self.focused_checker=Thread(target=self.check_focused)  # check if out of focused window in a thread
        self.focused_checker.start()
    
    def start(self):
        # initialize and start listener
        self.l=keyboard.Listener( on_press=self.on_press, on_release=self.on_release)
        self.l.start()
    def close(self):
        # stop and close keylog
        self.is_closed=True
        self.stop()
    def stop(self):
        # stop listener
        self.l.stop()
        self.l.join()
        
    def check_focused(self):
        while not self.is_closed:
            if GetWindowText(GetForegroundWindow())!=self.listened_window:  # compare now focused window with listened window
                if not self.is_paused:  # if different and not paused, stop listening
                    self.stop()
                    self.is_paused=True
            elif self.is_paused:  # if same but paused, restart listening
                    self.start()
                    self.is_paused=False
            time.sleep(0.1)

嗨,我在Windows上遇到了类似的问题,这是我的解决方案。不同的平台,但可能会给您一些灵感。

简而言之,您需要一个函数来检查循环中的集中窗口,并通过布尔变量作为内部标志更改侦听器的状态。

不是内置功能,但该解决方案在文档中指示,如下所示。

pynput.keyboard.listener.stop已被调用,听众无法重新启动,因为听众是线程。

如果您的应用程序需要切换侦听事件,您必须添加一个内部标志才能忽略事件需要,或在恢复聆听时创建新的听众。

pynput文档

相关内容

  • 没有找到相关文章

最新更新