Nicht-Javascript-Methode
Eigentlich mag ich Lösungen, die möglicherweise auf Javascript basieren, da sie eher webbezogen sind und gute Chancen bestehen - OS-unabhängig. Ich habe jedoch darüber nachgedacht, wie Sie Ihr Problem für alle Browser beheben können, da es in diesem Fall schwierig ist, Javascript-Lösungen für alle möglichen Browser anzupassen (ich bin mir nicht sicher, ob dies überhaupt möglich ist).
Wie Sie bereits erwähnt haben, gibt es eine andere Möglichkeit: das Verhalten auf Betriebssystemebene zu emulieren. Dies hat noch einen weiteren Vorteil: Sie können sicher sein, dass der Browser zu 100% menschlich aussieht (weil der Treiber das Signal sendet). Sie können also treiber- / gerätebasierte Lösungen mit jedem Browser verwenden (oder sogar in Situationen, in denen Javascript deaktiviert ist).
Linux
Leider führt die Einbeziehung von Treiber / Gerät sofort zu einer Abhängigkeit vom Betriebssystem. Für jedes Betriebssystem benötigen Sie eine eigene Lösung. In diesem Beitrag konzentriere ich mich auf Linux-basierte Lösungen (wird also mit Linux funktionieren) - und Mac OS ein wenig. Unter Linux ist es möglich, Ereignisse explizit auf das Gerät zu schreiben. Im Folgenden finden Sie ein Funktionsbeispiel mit Hauptschleife:
int main()
{
struct input_event event, event_end;
int fd = open("/dev/input/event4", O_RDWR);
long ma = getInteger("Enter max amplitude [points, 0..50]: ", 0, 50);
long ta = getInteger("Enter max wait time [usecs , 0..200000]: ", 0, 200000);
if (fd < 0)
{
printf("Mouse access attempt failed:%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;
gettimeofday(&event_end.time, NULL);
event_end.type = EV_SYN;
event_end.code = SYN_REPORT;
event_end.value = 0;
while(1)
{
event.code = rand() % 2 ? REL_X : REL_Y;
event.value = (rand() % 2 ? -1 : 1) * randomTill(ma);
write(fd, &event, sizeof(event));
write(fd, &event_end, sizeof(event_end));
usleep(randomTill(ta));
}
close(fd);
return 0;
}
Mein vollständiger Code für das Problem finden Sie hier . Das Programm fragt nach der Amplitude des "Zitterns" und seiner Frequenz (also wie viel Zeit in Mikrosekunden zwischen "Zittern" liegt). Um die Situation zu emulieren, wird die Maus gezwungen, sich zufällig nach 0..X
Punkten in zufälliger Richtung zu bewegen (oben-unten-links-unten) und zufällig 0..Y
Mikrosekunden bis zum nächsten "Tremor" zu warten. Es gibt X
eine Amplitude von "Tremor" und Y
eine Frequenz von "Tremor" ""
Eine andere Möglichkeit besteht darin, das Programm an Ihr System anzupassen. Das Programm ist "Dummy" und kann die Maus nicht selbst erkennen, "/dev/input/event4"
ist also fest codiert. Um festzustellen, welche Kennung für Ihr System möglicherweise vorhanden ist, können Sie Folgendes versuchen:
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
Und so sind Möglichkeiten "event3"
und "event4"
- aber für Ihr System, die andere Werte haben können. Wenn sich dies von der derzeit im C-Code verwendeten unterscheidet, ändern Sie einfach die entsprechende Zeile (also Zeile mit int fd = open("/dev/input/event4", O_RDWR);
und platzieren Sie Ihr Gerät anstelle von event4
).
Eine GIF-Demo für dieses Programm (leider niedrige Bildrate, also Bild nicht zu groß halten) hier .
Eine kleine Randnotiz (wenn Sie nicht wissen, was Sie mit C-Code tun sollen) - um das obige Programm zu kompilieren, verwenden Sie einfach:
user@host:/path$ gcc -std=gnu99 file.c -o m
Wo file.c
ist der Name Ihrer C-Quellcodedatei, dann erhalten Sie eine ausführbare Datei, die m
in Ihrem Verzeichnis aufgerufen wird . Höchstwahrscheinlich benötigen Sie Berechtigungen, um direkt in das Mausgerät zu schreiben. Sie können also Folgendes verwenden sudo
:
user@host:/path$ sudo ./m
Anderes Betriebssystem
Die Logik bleibt gleich:
- Finden Sie einen Weg, um auf Ihr Mausgerät zuzugreifen
- Schreibe das Ereignis einer sich bewegenden Maus
- Wenden Sie eine Randomisierung auf Ihre Veranstaltung an
Das ist es. Zum Beispiel hat Mac OS seine eigene Art, mit der Maus zu arbeiten (nicht wie Linux, Mac auch nicht procfs
), es wird hier gut beschrieben .
Als Schlussfolgerung
Was besser ist - Javascript oder geräteorientierte Lösungen - liegt bei Ihnen, da bestimmte Bedingungen (wie browser- oder betriebssystemübergreifend) in diesem Fall alles entscheiden können. Aus diesem Grund habe ich Richtlinien zusammen mit bestimmten Arbeitsbeispielen zur Implementierung auf Betriebssystemebene bereitgestellt. Der Vorteil hierbei ist, dass die Lösung browserübergreifend ist, aber als Kosten haben wir ein OS-gebundenes Programm.