Cara non-javascript
Sebenarnya, saya suka solusi, yang mungkin didasarkan pada javascript, karena mereka lebih cenderung terkait web, dan peluang bagus adalah - OS-independent. Namun, saya sedang memikirkan - bagaimana menyelesaikan masalah Anda untuk semua browser, karena solusi javascript, dalam hal ini, akan sulit untuk disesuaikan untuk semua browser yang mungkin (saya tidak yakin apakah itu mungkin sama sekali).
Jadi, seperti yang telah Anda sebutkan, ada cara lain - yaitu meniru perilaku pada tingkat OS. Ini memiliki keuntungan lain juga - Anda mungkin yakin bahwa untuk peramban itu terlihat 100% seperti manusia (karena, baik itu driver yang mengirimkan sinyal). Jadi, Anda dapat menggunakan solusi berbasis driver / perangkat dengan browser apa pun (atau bahkan dalam situasi, ketika javascript dinonaktifkan).
Linux
Sayangnya, melibatkan driver / perangkat segera menyebabkan ketergantungan OS. Jadi untuk setiap OS Anda membutuhkan solusi sendiri. Dalam posting ini saya fokus pada solusi berbasis Linux (jadi, akan bekerja dengan Linux) - dan Mac OS sedikit. Dengan Linux, dimungkinkan untuk menulis acara ke perangkat secara eksplisit, jadi di bawah ini adalah contoh fungsi dengan loop utama:
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;
}
Kode lengkap saya untuk masalah ini dapat ditemukan di sini . Program akan meminta amplitudo "tremor" dan frekuensinya (dengan demikian, berapa banyak waktu dalam mikro-detik antara "tremor"). Untuk meniru situasi, itu akan memaksa mouse untuk bergerak secara acak untuk 0..X
titik - titik dalam arah acak (atas-bawah-kiri-bawah) dan menunggu secara acak 0..Y
mikro-detik sampai "tremor" berikutnya, ada X
amplitudo "tremor" danY
frekuensi "tremor" "
Hal lain mungkin untuk mengadaptasi program untuk sistem Anda. Program ini "dummy" dan tidak dapat mendeteksi mouse dengan sendirinya, jadi "/dev/input/event4"
ini adalah kode-keras. Untuk menyadari apa yang mungkin menjadi pengidentifikasi untuk sistem Anda, Anda dapat mencoba:
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
Dan kemungkinannya adalah "event3"
dan "event4"
- tetapi untuk sistem Anda yang mungkin memiliki nilai lain. Jadi, jika itu berbeda dari yang saat ini digunakan dalam kode C, ubah saja baris yang sesuai (jadi, baris dengan int fd = open("/dev/input/event4", O_RDWR);
dan tempatkan perangkat Anda, bukanevent4
)
Demo gif untuk program ini (frame rate rendah, sayangnya, jadi jaga agar gambar tidak terlalu besar) di sini .
Sedikit catatan (jika Anda tidak tahu apa yang harus dilakukan dengan kode C) - untuk mengkompilasi program di atas, cukup gunakan:
user@host:/path$ gcc -std=gnu99 file.c -o m
di mana file.c
nama file kode sumber C Anda, maka Anda akan dapat dieksekusi, dipanggil m
dalam direktori Anda. Kemungkinan besar Anda akan memerlukan izin untuk menulis ke perangkat mouse secara langsung, sehingga Anda dapat menggunakan sudo
:
user@host:/path$ sudo ./m
OS lainnya
Logikanya akan tetap sama:
- Temukan cara untuk mengakses perangkat mouse Anda
- Tulis acara menggerakkan mouse
- Terapkan pengacakan untuk acara Anda
Itu dia. Sebagai contoh, Mac OS memiliki caranya sendiri untuk bekerja dengan mouse (tidak seperti Linux, Mac belum procfs
juga), itu dijelaskan dengan baik di sini .
Sebagai sebuah kesimpulan
Apa yang lebih baik - solusi javascript atau berorientasi perangkat - terserah Anda, karena kondisi tertentu (seperti cross-browser atau cross-OS) dapat memutuskan segalanya dalam hal ini. Oleh karena itu, saya telah memberikan panduan bersama dengan contoh kerja tertentu tentang bagaimana mengimplementasikannya pada level OS. Manfaatnya di sini adalah bahwa solusinya adalah lintas-browser, tetapi sebagai biaya kami memiliki program yang diikat dengan OS.