You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pynput.mouse的Listener无法停止,如何设置键盘快捷键终止程序

问题根因

你编写的代码存在执行顺序逻辑错误:listener.join() 是阻塞调用,会持续等待pynput鼠标监听线程终止后才会执行后续代码,因此你写在其后方的键盘按键检测循环永远不会被触发,自然无法响应快捷键停止程序。

修正方案

你需要将鼠标监听设置为非阻塞运行,让主线程负责检测键盘按键,触发退出时先终止鼠标监听再结束进程即可。修正后完整代码如下:

import sys
import pyautogui
import keyboard
from pynput.mouse import Listener

def on_move(x, y):
    print ("Mouse moved to ({0}, {1})".format(x, y))

def on_click(x, y, button, pressed):
    try: #FOR AUTO FAIL-SAFE
        if pressed:
            print ('Mouse clicked at ({0}, {1}) with {2}'.format(x, y, button))
            pyautogui.move(x+100,y+100)
    except:
        pass

def on_scroll(x, y, dx, dy):
    print ('Mouse scrolled at ({0}, {1})({2}, {3})'.format(x, y, dx, dy))

# 非阻塞启动鼠标监听
listener = Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll)
listener.start()

# 主线程负责检测按键
while True:
    if keyboard.is_pressed("q"):
        # 先终止鼠标监听线程再退出
        listener.stop()
        listener.join()
        sys.exit(0)

额外注意事项

  • 打包为exe后如果出现键盘检测无响应的问题,可尝试以管理员身份运行exe,部分系统权限限制会导致keyboard库无法读取全局按键输入
  • 可以把退出快捷键替换为组合键避免误触,比如改为ctrl+alt+q,只需将判断条件修改为if keyboard.is_pressed("ctrl+alt+q"):即可

内容的提问来源于stack exchange,提问作者Mr Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:45:03