如何用Python禁用特定按键?笔记本键盘5键随机触发求助
如何用Python禁用特定按键(数字5)
嘿,我来帮你搞定这个键盘乱跳的问题!首先得说,你之前写的代码有几个明显的小问题:
pynput.keyboard.Controller是用来模拟按键输入的工具,根本没有pressed()这个方法,它做不了监听拦截的活儿- 变量名写错了(
deni应该是disable?),而且KeyboardInterrupt continue的语法完全不对,这不是正确的异常处理方式
要实现禁用特定按键,我们得用键盘事件监听器来捕获按键按下的动作,然后把目标按键拦下来。先跟你说清楚:Python标准库没有直接处理全局键盘监听的工具,所以如果完全不用额外导入第三方库,几乎没法实现全局按键拦截——因为系统级的键盘API封装不在标准库里。不过用你一开始选的pynput就能轻松搞定,这是最适合新手的方式。
正确的实现代码
from pynput.keyboard import Key, Listener def on_press(key): # 拦截主键盘和小键盘的数字5 try: if key.char == '5': return False # 返回False就会把这个按键事件拦下来,系统收不到 except AttributeError: # 特殊按键(比如Shift、Ctrl)没有char属性,直接放行就行 pass def on_release(key): # 按ESC键就能停止监听,退出程序,省得你手动杀进程 if key == Key.esc: return False # 启动监听器,等着抓按键事件 with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()
代码怎么工作的?
Listener是pynput里专门用来监听键盘事件的类,每次按键按下时,on_press函数就会被调用- 当检测到按下的是数字
5时,返回False,这个按键事件就被拦截了,相当于“禁用”了5键 - 加了ESC键退出的逻辑,方便你随时停止程序,不然得去任务管理器关进程
- 处理
AttributeError是因为像Shift这种特殊按键没有char属性,避免程序报错崩溃
关于“无需额外导入”的小说明
如果硬要完全不用第三方库,那只能直接调用系统原生API,比如Windows下用ctypes(这个是标准库)调用系统dll,但这种方式超级复杂,而且只适用于特定系统,新手很容易踩坑。给你个Windows下的示例参考,但真心不推荐你用这个:
import ctypes from ctypes import wintypes # 先配置Windows API的各种参数,有点繁琐 user32 = ctypes.WinDLL('user32', use_last_error=True) WH_KEYBOARD_LL = 13 WM_KEYDOWN = 0x0100 VK_5 = 0x35 # 主键盘5的虚拟键码 VK_NUMPAD5 = 0x6F # 小键盘5的虚拟键码 HOOKPROC = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_int, wintypes.WPARAM, wintypes.LPARAM) class KBDLLHOOKSTRUCT(ctypes.Structure): _fields_ = (('vkCode', wintypes.DWORD), ('scanCode', wintypes.DWORD), ('flags', wintypes.DWORD), ('time', wintypes.DWORD), ('dwExtraInfo', wintypes.ULONG_PTR)) def hook_proc(nCode, wParam, lParam): if nCode >= 0 and wParam == WM_KEYDOWN: kb_struct = ctypes.cast(lParam, ctypes.POINTER(KBDLLHOOKSTRUCT)).contents if kb_struct.vkCode in (VK_5, VK_NUMPAD5): return 1 # 返回1表示把这个事件拦下来 return user32.CallNextHookEx(None, nCode, wParam, lParam) # 设置钩子,开始监听 hook_func = HOOKPROC(hook_proc) user32.SetWindowsHookExW(WH_KEYBOARD_LL, hook_func, user32.GetModuleHandleW(None), 0) # 消息循环,保持程序运行 msg = wintypes.MSG() while user32.GetMessageW(ctypes.byref(msg), None, 0, 0) != 0: user32.TranslateMessage(ctypes.byref(msg)) user32.DispatchMessageW(ctypes.byref(msg))
这个代码需要管理员权限运行,而且只能在Windows用,逻辑复杂得很,新手很容易搞砸。所以还是乖乖用pynput吧,先装一下:pip install pynput,然后用前面那个简单的代码就行。
最后说一句,如果软件方法都试过没用,那大概率是键盘硬件出问题了,建议联系售后检修哦!
内容的提问来源于stack exchange,提问作者Kinko




