You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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()

代码怎么工作的?

  • Listenerpynput里专门用来监听键盘事件的类,每次按键按下时,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

火山引擎 最新活动