2016-11-15 8 views
0

아래 코드는 매우 직선이지만 클라이언트 이벤트가 발생하지 않습니다. 그러나, 나는 주어진 상대 값으로 마우스 포인터가 움직이는 것을 보았다.마우스 입력 포인터를 uinput 하위 시스템에서 이동 한 후 Click 이벤트를 에뮬레이트 할 수 없습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <linux/input.h> 
#include <linux/uinput.h> 

#define die(str, args...) do { \ 
     perror(str); \ 
     exit(EXIT_FAILURE); \ 
    } while(0) 

int 
main(void) 
{ 
    int     fd; 
    struct uinput_user_dev uidev; 
    struct input_event  ev; 
    int     dx, dy; 
    int     i; 

    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); 
    if(fd < 0) 
     die("error: open"); 

    if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0) 
     die("error: ioctl"); 
    if(ioctl(fd, UI_SET_KEYBIT, BTN_LEFT) < 0) 
     die("error: ioctl"); 

    if(ioctl(fd, UI_SET_EVBIT, EV_REL) < 0) 
     die("error: ioctl"); 
    if(ioctl(fd, UI_SET_RELBIT, REL_X) < 0) 
     die("error: ioctl"); 
    if(ioctl(fd, UI_SET_RELBIT, REL_Y) < 0) 
     die("error: ioctl"); 

    if(ioctl(fd, UI_SET_KEYBIT, BTN_MOUSE) < 0) 
     die("error: ioctl"); 

    memset(&uidev, 0, sizeof(uidev)); 
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample"); 
    uidev.id.bustype = BUS_USB; 
    uidev.id.vendor = 0x1; 
    uidev.id.product = 0x1; 
    uidev.id.version = 1; 

    if(write(fd, &uidev, sizeof(uidev)) < 0) 
     die("error: write"); 

    if(ioctl(fd, UI_DEV_CREATE) < 0) 
     die("error: ioctl"); 

    sleep(2); 

    srand(time(NULL)); 


      memset(&ev, 0, sizeof(struct input_event)); 
      ev.type = EV_REL; 
      ev.code = REL_X; 
      ev.value = 10; 
      if(write(fd, &ev, sizeof(struct input_event)) < 0) 
       die("error: write"); 

      memset(&ev, 0, sizeof(struct input_event)); 
      ev.type = EV_REL; 
      ev.code = REL_Y; 
      ev.value = 60; 
      if(write(fd, &ev, sizeof(struct input_event)) < 0) 
       die("error: write"); 

      memset(&ev, 0, sizeof(struct input_event)); 
      ev.type = EV_SYN; 
      ev.code = 0; 
      ev.value = 0; 
      if(write(fd, &ev, sizeof(struct input_event)) < 0) 
       die("error: write"); 

      memset(&ev, 0, sizeof(struct input_event)); 
      ev.type = EV_KEY; 
      ev.code = BTN_RIGHT; 
      ev.value = 0; 
      if(write(fd, &ev, sizeof(struct input_event)) < 0) 
       die("error: write"); 

      usleep(15000); 

    sleep(2); 

    if(ioctl(fd, UI_DEV_DESTROY) < 0) 
     die("error: ioctl"); 

    close(fd); 

    return 0; 
} 

참조 :

링크에서 http://thiemonge.org/getting-started-with-uinput

거기 내가 사용한 샘플 코드 uinput-하여 Sample.c이고, 약간보다는 절대적으로 20 회 이동 클릭 이벤트를 수정할 값.

내가 무엇이 누락 되었습니까?

답변

0

Okey, 나는 X Y Position의 절대 값을 설정하기 전에 아래의 코드를 도입하여 작동 시켰습니다.

memset(&ev, 0, sizeof(struct input_event)); 
gettimeofday(&ev.time,0); 
ev.type = EV_KEY; 
ev.code = BTN_LEFT; 
ev.value = 1; 
if(write(fd, &ev, sizeof(struct input_event)) < 0) 
    die("error: write"); 

따라서 흐름은 다음과 같습니다.

1) set EV_KEY(BTN_LEFT) 
2) SET EV_ABS(ABS_X) 
3) SET EV_ABS(ABS_Y) 
4) SET EV_SYNC(0)