键盘检测指令:cat /dev/input/event1 | hexdump

鼠标检测指令:cat /dev/input/event2 | hexdump

当键盘/鼠标有输入时,会有对应的一堆16进制输出。它其实对应着input_event结构体【24字节】。

struct input_event {struct timeval time;__u16 type;__u16 code;__s32 value;};
//==================获取键盘数据====================#include #include #include #include #include #include  int main(void){#define KEY_PATH"/dev/input/event1"int fd = -1, ret = -1;struct input_event ev;// 第1步:打开设备文件fd = open(KEY_PATH, O_RDONLY);if (fd < 0){perror("open,error");return -1;}printf("welcome size=%d.\n",sizeof(struct input_event));while (1){// 第2步:读取event事件包memset(&ev, 0, sizeof(struct input_event));ret = read(fd, &ev, sizeof(struct input_event));if (ret != sizeof(struct input_event)){perror("read,error");close(fd);return -1;}// 第3步:解析event包.printf("========================================================\n");printf("[%11u] type: %3d, code: %3d, value: %3d \n",ev.time.tv_sec,ev.type,ev.code,ev.value);//type: 1:按键同步//code: 键码['a'=30]//value:0:按键释放,1:按键按下,2:长按下} // 第4步:关闭设备close(fd);return 0;}

//=======获取鼠标数据=========#include //LDFLAGS := -lX11int GetDisplayInfo(int *screen_width,int *screen_height){Display *display = XOpenDisplay(NULL);if (display == NULL){printf("Error: cannot open display\n");return 1;}int screen_num = DefaultScreen(display);Screen *screen = ScreenOfDisplay(display, screen_num);*screen_width = WidthOfScreen(screen);*screen_height = HeightOfScreen(screen);printf("Screen size: %dx%d pixels\n", WidthOfScreen(screen), HeightOfScreen(screen));printf("Screen resolution: %dx%d dpi\n", (int) (WidthOfScreen(screen) * 25.4 / DisplayWidthMM(display, screen_num)),(int) (HeightOfScreen(screen) * 25.4 / DisplayHeightMM(display, screen_num)));XCloseDisplay(display);return 0;}int get_xy(int fd,struct input_event ts,int *x,int *y){static int nCnt = 0;read(fd,&ts,sizeof(ts));if(ts.type == EV_ABS && ts.code == ABS_X){*x = ts.value;nCnt = (nCnt+1)%3;return nCnt;}if(ts.type == EV_ABS && ts.code == ABS_Y){*y = ts.value;nCnt = (nCnt+1)%3;return nCnt;}return 0;}int main(void){ #define MOUSE_PATH"/dev/input/event2"int fd = -1, ret = -1;struct input_event ev;int data_size = sizeof(struct input_event);// 第1步:打开设备文件[需要权限运行]fd = open(MOUSE_PATH, O_RDONLY);if (fd 0){perror("get display info,error");return -2;}while (1){ static int raw_x=0; static int raw_y=0;int tmp =0;tmp = get_xy(fd,ev,&raw_x,&raw_y);if(tmp==2){int curr_x = 0;int curr_y = 0;curr_x = raw_x*screen_width/0xFFFF;curr_y = raw_y*screen_height/0xFFFF;printf("mousePos: x=%d,y=%d.\n",curr_x,curr_y);}}close(fd);return 0;}

方法2:采用SDL2 [simplle directmedia layer] , 此方法用于GUI项目,事件只针对SDL创建的窗口内有效

#include #include #define SDL_HOR_RES (800)#define SDL_VER_RES (600)typedef struct TagMonitor{int screen_w;int screen_h;SDL_Renderer *render;SDL_Texture *texture;} tagMonitor;// 将屏幕设置成指定ARGB颜色int update_win(tagMonitor *mt, uint32_t argb){uint32_t fb_data[SDL_HOR_RES * SDL_VER_RES]; // frame buffer data[w*h]for (size_t i = 0; i texture, NULL, fb_data, mt->screen_w * 4);SDL_RenderClear(mt->render);// 设定渲染的目标区域SDL_Rect destRect;destRect.x = 0;destRect.y = 0;destRect.w = mt->screen_w;destRect.h = mt->screen_h;// 复制材质到渲染器对象if (SDL_RenderCopy(mt->render, mt->texture, NULL, &destRect)){printf("Error,%s \n", SDL_GetError());return -1;}// 执行渲染操作SDL_RenderPresent(mt->render);return 0;}