JavaScript以外の方法
実際、私はJavaScriptに基づくソリューションが好きです。なぜなら、それらはWeb関連であり、OSに依存しない可能性が高いからです。ただし、私は考えていました。すべてのブラウザーで問題を解決する方法です。この場合、JavaScriptソリューションは、すべての可能なブラウザーに調整するのが難しいためです(それが可能かどうかはわかりません)。
だから、あなたが言ったように、別の方法があります-つまり、OSレベルで動作をエミュレートすることです。これにはもう1つの利点もあります。ブラウザーの場合、人間と同じように100%に見えるはずです(信号を送信しているのはドライバーだからです)。そのため、任意のブラウザーで(または状況によっては、JavaScriptが無効になっている場合でも)ドライバー/デバイスベースのソリューションを使用できます。
Linux
残念ながら、ドライバー/デバイスを使用すると、すぐにOSに依存します。したがって、OSごとに独自のソリューションが必要になります。この投稿では、Linuxベースのソリューション(したがって、Linuxで動作します)とMac OSに少し焦点を当てています。Linuxでは、デバイスにイベントを明示的に書き込むことができるため、以下はメインループを使用した関数のサンプルです。
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;
}
問題の私の完全なコードはここにあります。プログラムは、「微動」の振幅とその周波数を求めます(したがって、「微動」の間隔はマイクロ秒で何回か)。状況をエミュレートするために0..X
、ランダムな方向(上から左下)にポイントをランダムに移動させ0..Y
、次の「振戦」までランダムにマイクロ秒待機します。「振戦」のX
振幅があり、「振戦」のY
頻度です。 」
もう1つは、プログラムをシステムに適合させることです。プログラムは「ダミー」であり、それ自体で"/dev/input/event4"
はマウスを検出できないため、ハードコーディングされています。システムの識別子となるものを理解するには、次のことを試してください。
user@host:/path$ cat /proc/bus/input/devices | grep mouse
H: Handlers=mouse0 event3
H: Handlers=mouse1 event4
そして可能性は"event3"
andです"event4"
が、あなたのシステムにとっては他の価値があるかもしれません。したがって、それが現在Cコードで使用されているものと異なる場合は、対応する行を変更するだけです(したがって、のint fd = open("/dev/input/event4", O_RDWR);
代わりにデバイスを配置して配置しますevent4
)。
このプログラムのgifデモ(フレームレートが低いため、残念ながら画像を大きくしすぎないようにしてください)はこちら。
ちょっとした注意点(Cコードの処理方法がわからない場合)—上記のプログラムをコンパイルするには、次のコードを使用します。
user@host:/path$ gcc -std=gnu99 file.c -o m
ここfile.c
で、Cソースコードファイルの名前を指定するとm
、ディレクトリで呼び出される実行可能ファイルが取得されます。ほとんどの場合、マウスデバイスに直接書き込むためのアクセス許可が必要になるため、以下を使用できますsudo
。
user@host:/path$ sudo ./m
その他のOS
ロジックは同じままです。
- マウスデバイスにアクセスする方法を見つける
- マウス移動イベントの書き込み
- イベントにランダム化を適用する
それでおしまい。たとえば、Mac OSにはマウスを操作する独自の方法があります(Linuxとは異なり、Macにもありませんprocfs
)。これについては、こちらで詳しく説明しています。
結論として
特定の条件(ブラウザー間またはOS間など)がこの場合のすべてを決定する可能性があるため、何がより良い(JavaScriptまたはデバイス指向のソリューション)かはあなた次第です。したがって、OSレベルでそれを実装する方法の特定の実用的な例と一緒にガイドラインを提供しました。ここでの利点は、ソリューションがブラウザーに依存しないことですが、コストとしてOSにバインドされたプログラムがあります。