Python: Windows 系统中监测键盘输入的两种方法

本文介绍 Python 程序在 Windows 系统中监测键盘输入的两种方法:keyboard 和 pynput 工具包。


keyboard


keyboard 是一个第三方库,pip install 即可安装使用,官网链接如下:
keyboard, PyPI

本文以空格键暂停程序运行以获取键盘输入为例,展示 keyboard 的调用方法。

具体有两种方式实现。一种是 keyboard.hook 方法,相当于在进程中埋了一个“钩子”,在按下对应按键时触发一个函数,具体代码如下:

from datetime import datetime
import time

import keyboard

print()
dts = datetime.now()
flag = False


def abc(x):
    global flag
    a = keyboard.KeyboardEvent(event_type='down', scan_code=57, name='space')

    # # get key code and name
    # print("current key code:  {}".format(x.scan_code))
    # print("current key name:  {}".format(x.name))

    if x.event_type == a.event_type and x.scan_code == a.scan_code:
        print("You pressed {}.".format(a.name))
        flag = True


keyboard.hook(abc)
num_iter = 20

for i in range(num_iter):
    print(i)
    time.sleep(0.2) 
    if flag:
        print("Paused, please input something:")
        ipt = input()
        print("You input {}".format(ipt))
        flag = False

dte = datetime.now()
tm = round((dte - dts).seconds + (dte - dts).microseconds / (10 ** 6), 3)
print("total running time:  {} s".format(tm), '\n')

其中,keyboard.KeyboardEvent 中的 scan_code 和 name 参数即为按键的名称和代码,如果事先未知,可以在 abc 函数中 print 出来,参见注释掉的部分。这里列出几个常用按键的代码和名称:

namescan code
space57
enter28
ctrl29
shift42
right shift54
alt56
right alt56
backspace14
tab15
caps lock58
left windows91
esc1
up72
down80
left75
right77
`41
/53
\43
12
23
34
45
56
67
78
89
910
011

上述代码的运行效果如下:
hook

另一种方法是通过 keyboard.on_press 实现,代码如下:

import time

import keyboard


flag = False


def key_press(key):
    global flag
    if key.name == 'space':
        flag = True


keyboard.on_press(key_press)

num_iter = 20
for i in range(num_iter):
    print(i)
    time.sleep(0.2)
    if flag:
        print("Paused, please input something:")
        ipt = input()
        print("You input {}".format(ipt))
        flag = False

pynput


与 keyboard 相似,pynput 也是一个第三方库,pip install 即可安装使用,官网链接如下:
pynput, PyPI

除键盘监测外,pynput 还可以监测鼠标,本文暂不讨论该功能。

同样是以空格键暂停程序运行以获取键盘输入的场景,调用 pynput 时通过 pynput.keyboard.Listener 实现,具体代码如下:

import time

from pynput import keyboard


flag = False


def on_press(key):
    global flag

    if not flag:
        print("key {} is pressed".format(key))

    if key == keyboard.Key.space:
        flag = True


def on_release(key):
    pass


# ...or, in a non-blocking fashion:
listener = keyboard.Listener(
    on_press=on_press,
    on_release=on_release)
listener.start()

num_iter = 20
for i in range(num_iter):
    print(i)
    time.sleep(0.1)
    if flag:
        print("Paused, please input something:")
        ipt = input()
        print("You input {}".format(ipt))
        flag = False

局限性


如题所述,本文所介绍的两种方法都适用于 Windows 系统环境,但在远程控制 Linux 服务器时,这两种方法都会遇到问题,笔者暂未能解决,只好通过额外开启一个线程放置 input 函数来实现。

具体地,对于 pynput 工具包,官网给出了 platform limitation 的解释:
pynput, platform limitations

pynput, platform limitations, Linux

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我来回答您的问题。 pynput是Python的一个第三方库,可以用来控制键盘和鼠标。它提供了两个主要的模块:keyboard和mouse。以下是pynput的详细用法: 1. 安装pynput 在终端输入以下命令即可安装pynput: ``` pip install pynput ``` 2. 控制键盘 使用pynput控制键盘需要导入keyboard模块,然后创建一个Listener对象并定义回调函数来监听键盘事件。以下是一个示例代码: ```python from pynput import keyboard def on_press(key): try: print('Key {} pressed.'.format(key.char)) except AttributeError: print('Special key {} pressed.'.format(key)) def on_release(key): print('Key {} released.'.format(key)) with keyboard.Listener(on_press=on_press, on_release=on_release) as listener: listener.join() ``` 这个代码可以监听键盘按下和松开的事件,并打印出对应的键位信息。 3. 控制鼠标 使用pynput控制鼠标需要导入mouse模块,然后创建一个Controller对象来模拟鼠标操作。以下是一个示例代码: ```python from pynput.mouse import Button, Controller mouse = Controller() # 鼠标移动到(x, y)位置 mouse.position = (100, 200) # 鼠标左键单击 mouse.click(Button.left, 1) # 鼠标右键单击 mouse.click(Button.right, 1) # 鼠标滚轮向上滚动10个单位 mouse.scroll(0, 10) ``` 这个代码可以模拟鼠标移动、左键单击、右键单击和滚轮滚动操作。 以上就是pynput的详细用法,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值