453|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/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
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
快速回复 返回顶部 返回列表