我有一个Python图形应用程序,该应用程序在终端中运行,并使用PYNPUT模块接受键盘输入。我遇到的问题是,即使我的窗口管理器未关注运行应用程序的终端,Pynput一直接受输入。这使得在不小心输入应用程序的情况下将重点转移到另一个任务。
。理想情况下,我想能够:
- 当终端不在焦点中时,有pynput拒绝输入
或
- 有某种确定应用程序何时获得/失去焦点的方法(我可以模拟#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文档