如何在appJar窗口未聚焦时捕获键盘事件?
解决appJar窗口失焦时无法检测全局按键的问题
appJar自带的bindKey方法只能在窗口获得焦点时捕获按键输入,要实现全局按键监听(窗口失焦时也能响应),需要借助第三方键盘监听库,下面提供两种可行方案:
方案一:使用keyboard库(简洁易用)
keyboard库专门用于全局键盘事件监听,语法简单,适合快速实现需求。
步骤1:安装依赖
pip install keyboard
步骤2:修改后的完整代码
import appJar import keyboard app = appJar.gui() # 全局按键回调函数 def on_global_v_press(): print(0) # 原窗口内的按键监听(可选保留,窗口聚焦时也能触发) def window_key_press(key): if key == "v": print(0) # 窗口配置 app.setSize("550x350") app.setResizable(canResize=False) app.setBg("white", override=False, tint=False) app.setTransparency(100) # 绑定窗口内按键监听(可选) app.bindKey("v", window_key_press) # 注册全局热键:按下v时触发回调 keyboard.add_hotkey('v', on_global_v_press) # 程序退出时清理全局监听钩子,避免残留 def cleanup_on_exit(): keyboard.unhook_all() app.stop() app.setStopFunction(cleanup_on_exit) app.go()
注意事项
- Windows系统下运行程序可能需要管理员权限(右键以管理员身份启动),Linux/macOS可能需要
sudo执行,因为全局键盘监听需要系统级权限。
方案二:使用pynput库(功能更丰富)
pynput支持更细致的按键事件处理(如区分按下/释放、特殊按键),适合复杂场景。
步骤1:安装依赖
pip install pynput
步骤2:修改后的完整代码
import appJar from pynput import keyboard app = appJar.gui() # 全局按键按下事件回调 def on_key_press(key): try: # 检测普通字符按键 if key.char == 'v': print(0) except AttributeError: # 处理特殊按键(如Shift、Ctrl等,这里无需处理可忽略) pass # 窗口配置 app.setSize("550x350") app.setResizable(canResize=False) app.setBg("white", override=False, tint=False) app.setTransparency(100) # 启动全局按键监听线程 listener = keyboard.Listener(on_press=on_key_press) listener.start() # 程序退出时停止监听 def cleanup_on_exit(): listener.stop() app.stop() app.setStopFunction(cleanup_on_exit) app.go()
说明
- 如果需要监听特殊按键(如
ESC退出程序),可以在on_key_press或on_key_release函数中添加逻辑,比如:
然后在创建def on_key_release(key): if key == keyboard.Key.esc: cleanup_on_exit() return False # 停止监听Listener时传入on_release=on_key_release即可。
内容的提问来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

