2016-11-15 15 views
0

以下のコードはまっすぐですが、クライアントイベントが発生するのを確認できません。しかし、私はマウスポインターが与えられた相対値に移動参照してください。マウスポインタをuinputサブシステム内で移動した後、クリックイベントをエミュレートできません

#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) 
関連する問題