dwgx@blog:~$dwgx
> cd ../posts

MouseDash: 一度録って、ワンクリックで再生するマウスマクロ

// created

MouseDash は自作の Windows マクロツールで、マウスとキーボードの操作を一度録画し、あとはワンクリックで再生できる。2025 年 4 月に v1.0.0 を出した。既製品はネット上にいくらでもあるが、クローズドソースで安心できないか、録画したものが等速の直線でミリ秒単位の間隔にガチガチに固定されていて、一目で偽物だとわかる。自分が欲しかったのはロボットではなく人間の操作のように見える再生で、この方針が後々の設計を大量に決めることになった。

プログラム全体は main.py 一つで、GUI、録画、再生、設定、バックグラウンド監視スレッドまで全部そこに詰め込んである。個人プロジェクトでは細かく分けるのが好きではない。下回りは pynput でマウス移動、クリック、スクロールホイール、キーボードを拾い、マウスだけ、キーボードだけ、あるいは全部を録画できる。イベント列はそのまま JSON にして ./macros/ に放り込む。人間が読めて編集もできるので、後からマクロ編集ページを追加するのもスムーズだった。一件ずつ追加・削除・変更するだけで、バイナリと格闘する必要がない。UI は PyQt5 に PyQt-Fluent-Widgets を組み合わせ、通知は winotify でネイティブのものをポップさせる。最小化していても録画中か再生中かがわかる。

アンチ検出が肝だ。イベントの間に適応的なランダム遅延を挿入し、リズムに人間味を揺らぎとして加える。デフォルトでオンだがオフにもできる。再生は二モードあり、一度押して開始、もう一度押して停止か、押している間だけ再生して離すと停止。ゲームと表計算処理では手触りが違うので、それぞれ好みで使い分ける。プロセスロックは psutil を使い、指定したプロセスがアクティブなときだけ反応するので、誤作動を防げる。一回の録画は 300 秒の上限を設け、停止を押し忘れて数百メガの巨大マクロができてしまうのを防いでいる。

一番典型的にハマったのは、グローバル監視が効いたり効かなかったりする問題だ。散々調べたら権限の問題だった。Windows でグローバル入力を拾うには管理者権限で実行する必要があり、そうでないと pynput は一部の前面ウィンドウでどうしても拾えない。起動は簡単で、依存を入れて python main.py、ディレクトリは初回に自動生成される。技術スタックは Python 3.9+、PyQt5、pynput、psutil、winotify、pywin32 で、すべて requirements.txt に入っている。