如何单独屏蔽鼠标中键?解决中键单次点击连点问题
修复鼠标中键连点:释放后冻结0.1秒的实现方案
你的鼠标中键存在单次点击触发多次的硬件问题,希望通过程序在中键释放后冻结0.1秒,同时不影响其他按键正常使用。之前用pynput的suppress=True全局拦截事件再手动模拟按键的方案存在问题,以下是修正后的实现思路和代码。
原代码问题分析
suppress=True全局拦截所有鼠标事件,需要手动模拟所有按键和移动操作,不仅冗余,还会导致on_move中设置mouse.position触发无限循环- 中键的时间判断逻辑有误,按下时的判断条件无法准确拦截释放后0.1秒内的重复触发
修正后的代码
from pynput.mouse import Button, Listener import time class BlockMiddleClick: def __init__(self): # 记录中键可再次响应的时间点,初始为0表示立即允许 self.block_until = 0.0 # 不使用全局suppress,改为选择性抑制事件 with Listener(on_click=self.on_click) as listener: listener.join() def on_click(self, x, y, button, pressed): if button == Button.middle: current_time = time.time() if pressed: # 按下中键时,检查是否已过冻结时间 if current_time >= self.block_until: # 允许事件传递给系统 return False else: # 抑制本次按下事件 return True else: # 释放中键时,设置0.1秒后才可再次响应 self.block_until = current_time + 0.1 # 允许释放事件传递 return False # 其他按键事件直接允许传递 return False if __name__ == "__main__": blocker = BlockMiddleClick()
关键逻辑说明
- 去掉
suppress=True,改为在on_click回调中通过返回值选择性抑制事件:返回True表示拦截该事件,不传递给系统;返回False表示允许事件正常处理 - 用
self.block_until记录中键可再次响应的时间点,释放中键时设置为当前时间+0.1秒 - 中键按下时,若当前时间未到
block_until则拦截事件,避免重复触发;已过时间则正常传递 - 其他按键(左、右、侧键)和移动事件完全不干预,保持系统原有行为
内容的提问来源于stack exchange,提问作者Karol Szymczak
相关产品推荐
相关产品推荐

