【DigiKey“智造万物,快乐不停”创意大赛】3,Pi400 键盘动作的捕捉与独占
[复制链接]
本帖最后由 eew_dy9f48 于 2024-1-5 08:19 编辑
一般在python中捕获键盘动作,大家使用的都是keyboard库,简单好用。但keyboard库有个致命的问题,就是无法独占键盘。这在我们当前的应用中是无法接受的。试想一下,当我们想发送ctrl+alt+del时,一旦按下,树莓派和电脑都进入了安全模式。你无法预期在键盘上的操作会在树莓派系统中整出什么幺蛾子。因此,我们需要在捕捉键盘动作的同时,对键盘资源进行独占,以此避免按键被其他的进程捕获。在这里我们使用evdev库来实现。
···
import os
import evdev
if os.geteuid() != 0:
raise ImportError('You must be root to use this library on linux.')
dev = evdev.InputDevice('/dev/input/event0')
dev.grab() # grab 是为了独占,保证此设备不会被别的进程捕获
for event in dev.read_loop():
key = evdev.categorize(event)
if isinstance(key, evdev.KeyEvent) and key.keystate != 2:
print(key.keycode)
···
按下按键,我们就可以看到对应的键值被打印在终端里。
接下来只需要把抓取到的键值组合成列表,发送到我们上一步实现的hid中即可。
细心的同学可能会意识到,evdev抓取到的的键值如果和hid的键值不匹配怎么办?这里我们就需要人工进行匹配,创建一个文件,将他们一一对应起来。
在项目文件夹下创建一个codemap.csv文件,写入以下对应:
···
KEY_LEFTCTRL,MOD_LEFT_CONTROL
KEY_RIGHTCTRL,MOD_RIGHT_CONTROL
KEY_LEFTALT,MOD_LEFT_ALT
KEY_RIGHTALT,MOD_RIGHT_ALT
KEY_LEFTSHIFT,MOD_LEFT_SHIFT
KEY_RIGHTSHIFT,MOD_RIGHT_SHIFT
,
KEY_LEFTMETA,MOD_LEFT_GUI
,
,
KEY_ESC,KEY_ESC
KEY_TAB,KEY_TAB
KEY_CAPSLOCK,KEY_CAPSLOCK
,
KEY_NUMLOCK,KEY_NUMLOCK
KEY_SYSRQ,KEY_SYSRQ
KEY_DELETE,KEY_DELETE
KEY_INSERT,KEY_INSERT
KEY_BACKSPACE,KEY_BACKSPACE
KEY_ENTER,KEY_ENTER
,
KEY_SPACE,KEY_SPACE
,
KEY_UP,KEY_UP
KEY_DOWN,KEY_DOWN
KEY_LEFT,KEY_LEFT
KEY_RIGHT,KEY_RIGHT
,
KEY_PAGEUP,KEY_PAGEUP
KEY_PAGEDOWN,KEY_PAGEDOWN
KEY_HOME,KEY_HOME
KEY_END,KEY_END
,
KEY_F1,KEY_F1
KEY_F2,KEY_F2
KEY_F3,KEY_F3
KEY_F4,KEY_F4
KEY_F5,KEY_F5
KEY_F6,KEY_F6
KEY_F7,KEY_F7
KEY_F8,KEY_F8
KEY_F9,KEY_F9
KEY_F10,KEY_F10
KEY_F11,KEY_F11
KEY_F12,KEY_F12
,
KEY_GRAVE,KEY_GRAVE
KEY_1,KEY_1
KEY_2,KEY_2
KEY_3,KEY_3
KEY_4,KEY_4
KEY_5,KEY_5
KEY_6,KEY_6
KEY_7,KEY_7
KEY_8,KEY_8
KEY_9,KEY_9
KEY_0,KEY_0
KEY_MINUS,KEY_MINUS
KEY_EQUAL,KEY_EQUAL
,
KEY_Q,KEY_Q
KEY_W,KEY_W
KEY_E,KEY_E
KEY_R,KEY_R
KEY_T,KEY_T
KEY_Y,KEY_Y
KEY_U,KEY_U
KEY_I,KEY_I
KEY_O,KEY_O
KEY_P,KEY_P
KEY_A,KEY_A
KEY_S,KEY_S
KEY_D,KEY_D
KEY_F,KEY_F
KEY_G,KEY_G
KEY_H,KEY_H
KEY_J,KEY_J
KEY_K,KEY_K
KEY_L,KEY_L
KEY_Z,KEY_Z
KEY_X,KEY_X
KEY_C,KEY_C
KEY_V,KEY_V
KEY_B,KEY_B
KEY_N,KEY_N
KEY_M,KEY_M
,
KEY_LEFTBRACE,KEY_LEFTBRACE
KEY_RIGHTBRACE,KEY_RIGHTBRACE
KEY_BACKSLASH,KEY_BACKSLASH
KEY_SEMICOLON,KEY_SEMICOLON
KEY_APOSTROPHE,KEY_APOSTROPHE
KEY_COMMA,KEY_COMMA
KEY_DOT,KEY_DOT
KEY_SLASH,KEY_SLASH
,
KEY_KP0,KEY_KP0
KEY_KP1,KEY_KP1
KEY_KP2,KEY_KP2
KEY_KP3,KEY_KP3
KEY_KP4,KEY_KP4
KEY_KP5,KEY_KP5
KEY_KP6,KEY_KP6
KEY_KP7,KEY_KP7
KEY_KP8,KEY_KP8
KEY_KP9,KEY_KP9
KEY_KPASTERISK,KEY_KPASTERISK
KEY_KPMINUS,KEY_KPMINUS
KEY_KPPLUS,KEY_KPPLUS
KEY_KPDOT,KEY_KPDOT
KEY_KPSLASH,KEY_KPSLASH
···
接着在代码中,我们只需要打开该文件,转换为字典,删除空白项,即可制作好对应的字典。每次捕捉到按键后,利用字典翻译一下即可。
···
with open('./codemap.csv', 'r') as file:
reader = csv.reader(file)
codemap = {rows[0]:rows[1] for rows in reader}
del codemap[""]
···
|