【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()
-
- 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[""]
-
- ···
|