Wie kann ich die Mausbewegung unter Linux steuern?

Lesezeit: 4 Minuten

Benutzeravatar von thundertrick
Donnerschlag

Ich versuche, die Maus unter Linux zu steuern. Xlib scheint zu funktionieren, aber wenn ich versuche, es mit zu verwenden OpenCVes kommt immer wieder:

Resource temporarily unavailable

Also beschloss ich, “/dev/psaux” zu schreiben. Der Code lautet wie folgt:

#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;
}

Kompilieren Sie es mit:

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

Laufen

sudo ./my_psaux

und bekomme

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

Die Maus bewegt sich jedoch nicht. Dann öffne ich ein neues Terminal, tippe “sudo cat /dev/psaux” ein und führe “my_psaux” aus. Aber ich katze einfach nichts. In “/dev/psaux” wird nichts geschrieben

Wie kann ich das beheben?

Wenn dies keine gute Methode zur Steuerung der Maus ist, gibt es eine andere?

  • Wenn Sie nicht erwarten, dass sich die Maus physisch bewegt, ist das Schreiben auf den PS / 2-Anschluss meiner Meinung nach nicht der richtige Weg, dies zu tun …

    – Blind

    6. Oktober 2011 um 14:02 Uhr

  • tronche.com/gui/x/xlib/input/pointer-grabbing.html

    – Lerikson

    6. Oktober 2011 um 14:54 Uhr

  • Vielen Dank für Ihren Kommentar. Früher dachte ich das. Aber genau wie @R.. sagte, es ist eher so etwas wie ein Terminal. Mit anderen Worten, wir haben die Maus noch nicht erreicht.

    – Donnerschlag

    6. Oktober 2011 um 15:00 Uhr


  • Ich bezweifle es, du klingst immer noch sehr verwirrt…

    – Blind

    6. Oktober 2011 um 15:47 Uhr

Benutzeravatar von thundertrick
Donnerschlag

Vielen Dank an R…
für die Erinnerung an einige andere Möglichkeiten statt /dev/psaux

Ich habe es versucht /dev/input/mouse* Und /dev/input/event*

Durch die Nutzung

cat /proc/bus/input/devices

Ich bekomme das:

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

Nur nach dem Testen /dev/input/event10 funktioniert. Der Code lautet wie folgt:

#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;
}

R.. GitHub STOP HELPING ICEs Benutzeravatar
R.. GitHub HÖREN SIE AUF, ICE ZU HELFEN

Die Maus ist kein Loopback/Echo-Gerät. Es ist eher wie ein Terminal. Würden Sie erwarten, dass beim Schreiben von Daten an ein Terminal (das auf dem Bildschirm erscheinen würde) dieselben Zeichen als Eingabe zu Ihnen zurückkommen? Dasselbe gilt für die Maus; Der einzige Punkt, an den es geschrieben werden kann, besteht darin, Escape-Sequenzen zu senden, die seinen Modus ändern (z. B. das verwendete Protokoll oder die Auflösung).

Wenn Sie die Maus “steuern” möchten, müssen Sie Ereignisse auf andere Weise einfügen oder ein Fifo (benannte Pipe) oder ein Pseudo-TTY anstelle von bereitstellen /dev/psaux für das Eingabesystem zum Lesen. Dies ist jedoch wahrscheinlich eine ziemlich fehlgeleitete Vorgehensweise …

Wenn Sie erklären, warum Sie die Maus steuern müssen, könnten wir Ihnen vielleicht bessere alternative Ansätze für das bieten, was Sie tun möchten.

  • Danke für die Antwort. Rohr hört sich nach einer guten Idee an. Ich versuche, etwas (wie Kinect) zu tun, um die Mausbewegung zu steuern. Xlib wurde versucht, ist aber fehlgeschlagen. Irgendein Vorschlag?

    – Donnerschlag

    6. Oktober 2011 um 14:49 Uhr


  • @R .. Im Gegensatz zu Ihrer Antwort geben die Geräte /dev/input/event* tatsächlich alles wieder, was Sie ihnen schreiben, wenn es mit den vom Gerät unterstützten Ereignissen kompatibel ist. Ein write()-Aufruf an ein /dev/input/event*-Gerät fügt die geschriebenen Ereignisse ein, als ob das Ereignis vom Gerät selbst käme: Siehe lxr.free-electrons.com/source/drivers/input/evdev.c#L457

    – fons

    30. Mai 2014 um 18:29 Uhr


  • Interessant. Ich habe dies nicht überprüft, aber es scheint ein evdev-spezifisches Verhalten zu sein. Sicherlich die psaux Geräteknoten hat sich nicht so verhalten; Es ermöglichte, dass Befehle, die die Geräteeinstellungen (wie dpi) steuern, auf die Maus geschrieben werden.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    30. Mai 2014 um 19:18 Uhr

1443710cookie-checkWie kann ich die Mausbewegung unter Linux steuern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy