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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。