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

如何用键盘监听器控制鼠标监听器启停及恢复?问题求助

问题解决:实现鼠标监听器的启停切换

问题原因

原代码通过with语句初始化鼠标监听器,调用stop()后监听器对象会被彻底终止并释放资源,无法再次复用。同时F6对应的m_listener.join()是等待监听器结束的逻辑,并非启动监听器的正确方式。

修复后的代码

import pynput
from pynput import keyboard, mouse

# 全局变量存储鼠标监听器实例
m_listener = None

def on_x_y_click(x, y, button, pressed):
    print((x, y, button, pressed))

def start_mouse_listener():
    global m_listener
    # 仅当监听器未运行时创建并启动
    if m_listener is None or not m_listener.running:
        m_listener = mouse.Listener(on_click=on_x_y_click)
        m_listener.start()

def stop_mouse_listener():
    global m_listener
    if m_listener is not None and m_listener.running:
        m_listener.stop()
        # 等待监听器线程结束,释放资源
        m_listener.join()
        m_listener = None

def on_release(key):
    print(key)
    if key == keyboard.Key.f6:
        start_mouse_listener()
    elif key == keyboard.Key.f7:
        stop_mouse_listener()
    elif key == keyboard.Key.esc:
        stop_mouse_listener()
        return False

# 启动键盘监听器
with keyboard.Listener(on_release=on_release) as k_listener:
    k_listener.join()

关键改动说明

  • 移除鼠标监听器的with语句,改为动态创建和销毁实例,避免一次性绑定资源
  • 新增start_mouse_listener()和stop_mouse_listener()函数,封装启停逻辑,保证状态判断的准确性
  • F6触发时检查监听器状态,仅在未运行时新建并启动实例
  • F7触发时停止监听器,等待线程结束后清空实例,确保下次F6能重新创建有效监听器
  • ESC键触发时停止鼠标监听器并终止键盘监听器,完成程序退出流程

内容的提问来源于stack exchange,提问作者Ahmed Mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:12:27