Python键鼠禁用代码失效及跨脚本调用问题求助
解决键鼠禁用失效及跨脚本调用问题
先拆解下你原代码里的核心问题,这俩问题直接导致了键鼠没被正确拦截,还没法被其他脚本调用:
- 钩子回调里用
time.sleep(1)是致命错误!pyHook的钩子回调是在系统消息线程里执行的,sleep会直接阻塞整个消息泵,后续的键鼠事件根本没机会被钩子捕获,自然没法拦截。 - 代码直接运行
pythoncom.PumpMessages()会阻塞主进程,其他脚本调用后就卡在这行,根本没法继续执行其他逻辑。 - 还有一行无效代码
time.perf_counter,纯属多余,没起到任何作用。
修复后的键鼠禁用代码
我调整了逻辑,用线程隔离消息泵避免阻塞,同时去掉回调里的sleep,改用时间戳判断拦截时长:
import pythoncom import pyHook import time import threading class InputBlocker: def __init__(self): self.start_time = 0 self.block_duration = 0 self.hm = pyHook.HookManager() self.hm.MouseAll = self._block_input self.hm.KeyAll = self._block_input self.is_blocking = False def _block_input(self, event): # 检查是否仍在阻塞时长内 if time.time() - self.start_time < self.block_duration: return False # 返回False拦截当前输入事件 else: # 时长到了自动解除钩子 if self.is_blocking: self.hm.UnhookMouse() self.hm.UnhookKeyboard() self.is_blocking = False return True def block_for(self, seconds): if self.is_blocking: return # 避免重复触发阻塞 self.block_duration = seconds self.start_time = time.time() self.is_blocking = True # 挂载钩子 self.hm.HookMouse() self.hm.HookKeyboard() # 子线程运行消息泵,不阻塞主进程 threading.Thread(target=pythoncom.PumpMessages, daemon=True).start()
跨脚本调用方法
把上面的代码保存为input_blocker.py,然后在其他Python脚本里这样调用:
from input_blocker import InputBlocker import time # 初始化拦截器 blocker = InputBlocker() print("开始禁用键鼠10秒...") # 触发10秒拦截 blocker.block_for(10) # 这里可以正常执行其他代码,不会被阻塞 time.sleep(11) print("键鼠禁用已结束")
额外注意事项
- 确保pyHook版本和你的Python位数(32/64位)匹配,不然钩子可能无法正常挂载。
- Windows 10/11系统下建议以管理员权限启动Python,否则可能拦截不到部分系统级输入事件。
- 子线程用了
daemon=True,主进程退出时子线程会自动终止,避免残留后台进程。
内容的提问来源于stack exchange,提问作者An P
相关产品推荐
相关产品推荐

