为什么 pynput 不检测数字键盘按下?

Why pynput doesn't detect numeric keyboard presses?

我在 windows 7.

上使用 python 3.7

有什么方法可以检测 pynput 模块中的数字(例如:“1”)按键吗?

我已经尝试了很多其他模块,但除了 tkinter 之外,我一无所获 这需要 window 但我不想要那个。

from pynput import keyboard  
def on_press(key):
     print(key)
     if str(format(key)) == 'Key.1':
         print('Exiting...')
         return False 
with keyboard.Listener(on_press = on_press) as listener:
     listener.join()

它实际上只打印按下的键,从不刹车(不接受数字输入)。

快速浏览 doc 可以看出在某些平台上 num lock 键可能未定义。不幸的是,我没有 windows 机器来测试它。

num_lock = <Key.f1: 0>

The NumLock key. This may be undefined for some platforms.

您的代码正在测试值 "1"。这是,请原谅,如果您按 1 键,那么 pynput returns 是显而易见的。您要响应 NumLock 键。

而不是

if str(format(key)) == '1':

您可以对这些测试中的任何一个进行编码,这两个测试都会检查您要查找的值:

if key == keyboard.Key.num_lock:

if str(format(key)) == "Key.num_lock":

但是...有两种NumLock键。

一个是 Keyboard NumLock and Clear,它具有 USB 代码 (0x53) 和 Windows 虚拟键代码 (0x90)。 pynput 将响应按下此键。

另一种是 Keyboard Locking NumLock,它在键盘级别工作:它改变了键盘的行为方式,Windows 没有听说过它。它有一个 USB 代码 (0x83),但没有 Windows 虚拟键代码。如果该键没有虚拟键码,则按下它不会有 Windows 消息,并且 pynput 报告 Windows 消息。

因此该行为取决于硬件,可能是您的机器具有第二种 NumLock 密钥。如果是这样,那么您对 ​​pynput 说什么都无济于事。不过,这不太可能,除非您使用的是非常受限的笔记本电脑键盘。

您提供的代码似乎试图检测数字键“1”而不是 'Num lock'。

@BoarGules 给出了完整的答案。只是补充一点说明:

当您使用 pynput 监控键盘时,如果试图检测控制键,您应该将其与适当的 pynput.keyboard.Key 对象进行比较。在检查 num lock 的情况下,您的代码应如下所示:

if key == keyboard.Key.num_lock:
    print('exiting')

另一方面,如果您要查找字母数字键,请将其与 pynput.keyboard.Key代码:

进行比较
if key == keyboard.KeyCode(char = '1'):
    print('exiting')