Как контролировать движение мыши в Linux? - PullRequest
12 голосов
/ 06 октября 2011

Я пытаюсь управлять мышью в Linux. Xlib, кажется, работает, но когда я пытаюсь использовать его с OpenCV, он продолжает возвращаться:

Resource temporarily unavailable

Поэтому я решил написать "/ dev / psaux". Код выглядит следующим образом:

#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main() {
    unsigned char a[5]={0, 0xff, 0, 0x28, 0xff};
    int fp = open ("/dev/psaux", O_WRONLY);
    if(!fp)printf("open error:%s\n", strerror(errno));
    for(int i = 0; i < 10; i++)
        printf("write:%d\t\t%s\n", write(fp, a, 5), strerror(errno));
    close(fp);
    return 0;
}

Скомпилируйте его с помощью:

gcc  my_psaux.c -o my_psaux -std=gnu99 -g

Беги и получай

$sudo ./my_psaux 
write:5    Success
write:5    Success
write:5    Success
write:5    Success
write:5    Success
write:5    Success
write:5    Success
write:5    Success
write:5    Success
write:5    Success

Однако мышь не двигается. Затем я открываю новый терминал, набираю «sudo cat / dev / psaux» и запускаю «my_psaux». Но я просто ничего не кот. Ничего не записано в "/ dev / psaux"?

Может ли кто-нибудь мне помочь?

Если это плохой способ управления мышью, может кто-нибудь сказать мне другой?

Ответы [ 2 ]

17 голосов
/ 07 октября 2011

Большое спасибо @R .. за напоминание о некоторых других способах вместо /dev/psaux

Так что я попробовал /dev/input/mouse* и /dev/input/event*

Используя

cat /proc/bus/input/devices 

, я получаю это:

I: Bus=0003 Vendor=0461 Product=4d81 Version=0111
N: Name="USB Optical Mouse"
P: Phys=usb-0000:00:1d.0-1/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb6/6-1/6-1:1.0/input/input10
U: Uniq=
H: Handlers=mouse2 event10 
B: EV=17
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=143
B: MSC=10

После тестирования работает только /dev/input/event10.Код выглядит следующим образом:

#include <stdio.h>
#include <unistd.h>
#include <linux/input.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>

int main() {
  struct input_event event, event_end;

  int fd = open("/dev/input/event10", O_RDWR);
  if (fd < 0) {
    printf("Errro open mouse:%s\n", strerror(errno));
    return -1;
  }
  memset(&event, 0, sizeof(event));
  memset(&event, 0, sizeof(event_end));
  gettimeofday(&event.time, NULL);
  event.type = EV_REL;
  event.code = REL_X;
  event.value = 100;
  gettimeofday(&event_end.time, NULL);
  event_end.type = EV_SYN;
  event_end.code = SYN_REPORT;
  event_end.value = 0;
  for (int i=0; i<5; i++) {
    write(fd, &event, sizeof(event));// Move the mouse
    write(fd, &event_end, sizeof(event_end));// Show move
    sleep(1);// wait
  }
  close(fd);
  return 0;
}
2 голосов
/ 06 октября 2011

Мышь не является петлевым / эхо-устройством. Это больше похоже на терминал. Вы ожидаете, что запись данных в терминал (который появится на экране) заставит те же символы возвращаться к вам в качестве ввода? То же самое относится к мыши; единственное, что нужно написать - это послать escape-последовательности, которые изменяют его режим (например, используемый протокол или разрешение).

Если вы хотите «управлять» мышью, вам нужно внедрить события другим способом или предоставить fifo (именованный канал) или псевдо-tty вместо /dev/psaux для системы ввода для чтения из нее. Однако это, вероятно, довольно ошибочный способ сделать что-то ...

Если вы объясните, почему вам нужно управлять мышью, возможно, мы могли бы предложить вам лучшие альтернативные подходы к тому, что вы пытаетесь сделать.

...