为什么Pynput无法检测到数字键盘按键?

时间:2019-02-09 19:48:11

标签: python keyboard detection

我正在Windows 7上使用python 3.7。

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

我尝试了许多其他模块,但除了tkinter之外我什么也没有 需要一个窗户,但我不想要那个。

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()

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

3 个答案:

答案 0 :(得分:2)

您的代码正在测试值"1"。这是您表示明显的赦免,如果您按下pynput键,1会返回什么。您要响应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 :(得分:0)

快速浏览doc显示在某些平台上num lock键可能未定义。不幸的是,我没有Windows机器对此进行测试。

num_lock = <Key.f1: 0>
     

NumLock键。对于某些平台,可能未定义。

答案 2 :(得分:0)

您提供的代码似乎正在尝试检测数字键“ 1”,而不是“数字锁定”。

@BoarGules提供了完整的答案。只是需要澄清一下:

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

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

另一方面,如果您要查找字母数字键,请将其与pynput.keyboard.KeyCode进行比较:

if key == keyboard.KeyCode(char = '1'):
    print('exiting')