#include "simulate_mk.h"
simulate_mk::simulate_mk()
{
}
/**
*打开键盘事件的文件/dev/input/event2
*在/proc/bus/input/devices中查看那个文件是键盘
* @brief simulate_mk::simulate_key_fd
* @return fd_kbd
*/
int simulate_mk::simulate_key_fd()
{
int fd_kbd; // /dev/input/event4
fd_kbd = open("/dev/input/event4",O_RDWR);
if(fd_kbd<=0){
// 程序调用失败时,系统自动用错误代码填充errno这个全局变量
//strerror()自动翻译错误
printf("error open keyboard:%s\n",strerror(errno));
return -1;
}
return fd_kbd;
}
/**
*打开鼠标事件的文件/dev/input/event3
* /dev/input/event3(mice,mouse,mouse1),是鼠标的抽象,代表的是鼠标,
*在/proc/bus/input/devices中查看那个文件是鼠标
* @brief simulate_mk::simulate_mouse_fd
* @return fd_mouse
*/
int simulate_mk::simulate_mouse_fd()
{
int fd_mouse; // /dev/input/event5
fd_mouse = open("/dev/input/event5",O_RDWR);
if(fd_mouse<=0){
// 程序调用失败时,系统自动用错误代码填充errno这个全局变量
//strerror()自动翻译错误
printf("error open mouse:%s\n",strerror(errno));
return -2;
}
return fd_mouse;
}
/**
* 依次按下按键
* 其中0表示释放,1按键按下,2表示一直按下
* @brief simulate_mk::simulate_key_one
* @param a 按下次数
* @param b 按下的按键类型
*/
void simulate_mk::simulate_key_one(int k[],int m)
{
int fd=simulate_key_fd();
struct input_event event;
// for(int i=0;i<a;i++)//按下指定的所以按键
for(int i=0;i<m;i++)
{
//发送一个按下去的事件。
event.type = EV_KEY; //按键事件
event.value = 1;
event.code = k[i];
gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;
//event.type = EV_SYN; //同步事件
//event.code = SYN_REPORT;
//event.value = 0;
//write(fd, &event, sizeof(event));
//发送一个释放的事件。
memset(&event, 0, sizeof(event));//将0赋值到event中
gettimeofday(&event.time,NULL);
event.type = EV_KEY;
event.value = 0;
event.code = k[i];
write(fd,&event,sizeof(event)) ;
event.type = EV_SYN; //同步事件
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
sleep(1);
}
}
/**
* 同时按下多个键
* @brief simulate_mk::simulate_key_much
* @param fd
* @param a a存放按键个数,b[]依次存放对应的按键类型
*/
void simulate_mk::simulate_key_much(int k[],int m)
{
int fd=simulate_key_fd();
struct input_event event;
for(int i=0;i<m;i++)//按下指定的所以按键
{
//发送一个按下去的事件
event.type = EV_KEY; //按键事件
event.value = 1;
event.code = k[i];
gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;
event.type = EV_SYN; //同步事件,也就是报告给系统
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
}
for(int i=m;i>0;i--)//释放
{
//发送一个释放的事件
memset(&event, 0, sizeof(event));//将0赋值到event中
gettimeofday(&event.time,NULL);
event.type = EV_KEY;
event.value = 0;
event.code = k[i];
gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
}
sleep(1);
}
/**
*鼠标单击事件,0x110~0x116 为鼠标上按键代码,
* 其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,
* 0x112(BTN_ MIDDLE)为鼠标中键。其它代码含义请参看include/linux/input.h文件。
* @brief simulate_mk::simulate_mouse_down
* @param x 传入按键代码
*/
void simulate_mk::simulate_mouse_down(int k)
{
int fd=simulate_mouse_fd();
struct input_event event;
//发送一个按下去的事件。
event.type = EV_KEY; //按键事件
event.value = 1;
event.code = k;
gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;
//event.type = EV_SYN; //同步事件
//event.code = SYN_REPORT;
//event.value = 0;
//write(fd, &event, sizeof(event));
//发送一个释放的事件。
memset(&event, 0, sizeof(event));//将0赋值到event中
gettimeofday(&event.time,NULL);
event.type = EV_KEY;
event.value = 0;
event.code = k;
write(fd,&event,sizeof(event));
event.type = EV_SYN; //同步事件
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
sleep(1);
}
/**
*鼠标双击事件,0x110~0x116 为鼠标上按键代码,
* 其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,
* 0x112(BTN_ MIDDLE)为鼠标中键。其它代码含义请参看include/linux/input.h文件。
* @brief simulate_mk::simulate_mouse_double
* @param x 传入按键代码
*/
void simulate_mk::simulate_mouse_double(int k)
{
int fd=simulate_mouse_fd();
struct input_event event;
memset(&event, 0, sizeof(event));
gettimeofday(&event.time,NULL);
for(int i=1;i<3;i++)
{
event.type = EV_KEY; //按键事件
event.value = 1;
event.code = k;
gettimeofday(&event.time,0);
write(fd,&event,sizeof(event)) ;
event.type = EV_KEY;
event.value = 0;
event.code = k;
write(fd,&event,sizeof(event));
event.type = EV_SYN; //同步事件
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
}
sleep(1);
}
/**
* 鼠标移动
* @brief simulate_mk::simulate_mouse_move
* @param rel_x 小于0则为左移,大于0则为右移
* @param rel_y 小于0则为上移,大于0则为下移
* * @param rel_w 大于0则为上移,小于0则为下移
* @param t 移动次数
*/
void simulate_mk::simulate_mouse_move(int rel_x,int rel_y,int rel_w,int t)
{
int fd=simulate_mouse_fd();
struct input_event event;
for(int i=0;i<t;i++)
{
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_REL;//EV_REL相对坐标(轨迹球);EV_ABS 0x03 //绝对坐标
event.code = REL_X;
event.value = rel_x;
write(fd, &event, sizeof(event));
event.type = EV_REL;
event.code = REL_Y;
event.value = rel_y;
write(fd, &event, sizeof(event));
event.type = EV_REL;
event.code = REL_WHEEL;
event.value = rel_w;
write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
write(fd, &event, sizeof(event));
sleep(1);
}
}
/**
*将鼠标移动到指定坐标
* @brief simulate_mk::simulate_mouse_location
* @param x
* @param y
*/
void simulate_mk::simulate_mouse_location(int rel_x,int rel_y)
{
simulate_mouse_move(-1280,-1024); //屏幕分辨率1280X1024
simulate_mouse_move(rel_x,rel_y);
}