446|0

20

帖子

8

TA的资源

一粒金砂(中级)

楼主
 

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

···

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表