python键盘触发事件,python监控键盘按下事件

  python键盘触发事件,python监控键盘按下事件

  在此期间,需要完成在一定时间内决定是否手动操作的功能。基本思想是在后台监控键盘和鼠标的输入事件。那么,如何捕捉鼠标和键盘的事件呢?介绍我们的实现原理和方法。

  捕获设备输入事件的原理

  打开/dev/input目录,然后运行ls命令,您将看到类似于以下内容的文件列表:

  $ ls -l

  总计0

  CRW-R-. 1 2018年1月29日13,64事件0

  CRW-R-. 1 2018年1月29日13,65事件1

  CRW-R-. 1 2018年1月29日13,66事件2

  CRW-R-. 1 2018年1月29日13,67事件3

  CRW-R-. 1 2018年1月29日13,68事件4

  CRW-R-.1 13,63 2018年1月29日小鼠

  crw-r-. 1 2018年1月29日13,32鼠标0

  CRW-R-. 12018年1月29日13,33鼠标1

  CRW-R-. 12018年1月29日13,34鼠标2

  熟悉Linux的朋友一定知道,这里列出的文件都是设备文件。在Linux环境下,/dev/input目录下的事件文件(event*)都是通过调用驱动中的input _ register _ device)struct input _ dev * dev生成的,每个事件都会推动指定的事件,比如触摸、鼠标、按键等。当读取这些事件文件时,将获得事件文件对应的设备的输入信息。

  事件数据结构

  linux/input.h文件定义了事件event的输入数据的结构。该结构定义如下。

  结构输入事件{

  结构timeval时间;

  __u16型;

  __u16代码;

  __s32值;

  (;

  时间是事件发生的时间,具体定义如下:

  结构时间

  {

  _ _ time _ t tv _ sec/*秒。*/

  _ _ suseconds _ t tv _ usec/*微秒。*/

  (;

  类型是指事件类型。典型的事件类型包括:

  EV_KEY、按键事件、键盘按键、鼠标左键、鼠标右键等。

  EV_REL,相对坐标,主要用于鼠标移动事件;

  EV_ABS,绝对坐标,主要用于触摸屏的移动事件。

  代码事件代码。如果事件类型是EV_KEY,这个代码就是设备的键盘代码,在input.h文件中定义为以KEY_开头。

  值事件的值。如果事件类型代码为EV_KEY,则按键操作值为1,释放操作值为0。如果事件类型代码为EV_REL,则值表示正值,负值表示不同方向的值。

  如何确定事件文件适用于哪个设备?

  /proc/bus/input/device文件包含与事件对应的相关设备信息,如下所示:

  $卡特彼勒设备

  I:总线=0019供应商=0000产品=0001版本=0000

  N: Name=电源按钮

  p : phys=lnxpwrbn/button/input 0

  s:sysfs=/devices/lnx systm:00/lnxpwrbn:00/输入/输入0

  U: Uniq=

  H: Handlers=kbd事件0

  乙:EV=3

  b:key=100000000000

  I:总线=0017供应商=0001产品=0001版本=0100

  n:name= Macintosh mousebutton emulation

  物理=

  s:sysfs=/设备/虚拟/输入/输入1

  U: Uniq=

  H: Handlers=mouse0事件1

  乙:EV=7

  B: KEY=70000 0 0 0

  乙:REL=3

  I:bus=0011 vendor=0001 product=0001 version=ab41

  n:name= attranslatedset 2 keyboard

  物理=是

  a 0060/系列0/输入0

  s:Sysfs=/devices/platform/I 8042/serio 0/input/input 2

  U: Uniq=

  H: Handlers=kbd事件2

  乙:EV=120013

  b:KEY=4020000000 3803078 f800 d 001 feffffdfffefffff fffffffffff

  B: MSC=10

  B: LED=7

  I:总线=0011供应商=0002产品=0005版本=0000

  N: Name=ImPS/2通用滚轮鼠标

  P: Phys=isa0060/serio1/input0

  s:Sysfs=/devices/platform/I 8042/serio 1/input/input 3

  U: Uniq=

  H: Handlers=mouse1事件3

  乙:EV=7

  B: KEY=70000 0 0 0

  乙:REL=103

  可以在上面的H:中看到对应的eventxx。

  捕获键盘事件的实现方法

  通过上一节列出的文件,我们可以得到键盘对应的事件文件。通常键盘对应的事件文件是event2。通过监视这个文件,我们可以捕获键盘的事件。

  下面的代码是我实现的监控键盘事件的功能代码。如果20秒内没有键盘事件,程序退出:

  #包括

  #包括

  #包括

  #包括

  #包括

  #包括

  void listen _ device(const char * dev,int timeout)

  {

  int retval

  fd _ set readfds

  结构化电视;

  int fd=open(dev,O _ RDONLY);

  struct input_event事件;

  如果(fd 0)

  {

  佩罗尔(dev);

  返回;

  }

  while (1)

  {

  FD _ ZERO(read FDS);

  FD_SET(fd,read FDS);

  tv.tv _ sec=timeout

  电视。TV _ usec=0;

  if((retval=select(fd 1,readfds,NULL,NULL,tv))==1)

  {

  if (read(fd,event,sizeof(event))==sizeof(event))

  {

  if (event.type==EV_KEY)

  {

  如果(事件。值==0 事件。值==1)

  {

  printf(key %d %s\n ,event.code,event.value?已按下":"释放");

  }

  }

  其他

  {

  printf(type=%x %d %d\n ,event.type,event.code,event。值);

  }

  }

  }

  其他

  {

  打破;

  }

  }

  关闭(FD);

  }

  void listen _键盘(int超时)

  {

  listen _ device(/dev/input/event 2 ,超时);

  }

  int main(int argc,char **argv)

  {

  听着键盘(20);

  printf(键盘超时\ n’);

  返回0;

  }

  捕捉鼠标事件的实现方法

  我们也可以通过上面的方面获取鼠标的事件文件,从而实现鼠标事件的捕获。但事实上鼠标有更方便的捕获方法,就是同目录下的老鼠文件,通过该文件可以获取解析后的鼠标事件。

  具体方法如下:

  (1)打开/开发/输入/鼠标文件。

  (2)读3个字节。三个字节的值分别是"按钮类型“,”X的相对位移“,”Y的相对位移"。这里先用按钮,xRel,yRel表示。

  (3)取纽扣的低3位(按钮0x07).0x00=LeftButtonUp,0x01=LeftButtonDown,0x02=RightButtonDown .

  以下代码是我实现的监鼠标事件的函数代码:

  #包括

  #包括

  #包括

  #包括

  #包括

  #包括

  void listen_mice(const char *dev,int timeout)

  {

  char buf[256];

  整数长度

  返回值

  fd _ set readfds

  结构化电视;

  int fd=open(dev,O _ RDONLY);

  如果(fd 0)

  {

  佩罗尔(dev);

  返回;

  }

  while (1)

  {

  FD _ ZERO(读FDS);

  FD_SET(fd,读FDS);

  tv.tv _ sec=超时

  电视。TV _ usec=0;

  if((retval=select(fd 1,readfds,NULL,NULL,tv))==1)

  {

  if ((n_len=read(fd,buf,sizeof(buf))) 0)

  {

  如果(长度==3)

  {

  printf(Button: %d,xRef=%d,yRef=%d\n ,buf[0]0x07,buf[1],buf[2]);

  }

  }

  }

  其他

  {

  打破;

  }

  }

  关闭(FD);

  }

  void listen_mouse(int超时)

  {

  listen_mice(/dev/input/mice ,超时);

  }

  int main(int argc,char **argv)

  {

  listen _ mouse(20);

  printf(鼠标超时\ n’);

  返回0;

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: