- Tool
- Python
- Web
SmartMouse
スマートフォンのブラウザからWindows PCのマウス・キーボードを操作できるツール。

手元にマウスがない環境でもPCを操作できるようにするため、個人で企画・開発したツールです。Windows側の受信アプリ(Receiver)はPythonとFastAPI / Uvicornで実装し、PyInstallerでexe化して配布しています。スマホ側はアプリのインストールが不要なブラウザ版(TypeScript / Vite)で、Receiverに同梱して配信しています。Receiver画面のQRコードをスマホの標準カメラで読むだけで接続できます。接続にはReceiver起動ごとに変わる128bitのトークン認証を導入し、Bonjourによる自動検出と自動再接続にも対応。カーソル移動・クリック・スクロールに加えて、文字入力の送信やコピー/貼り付けまで実装しています。タスクトレイ常駐での運用や、Windows Defenderに誤検知されたときの対処など、「実際に配布したときに起きる問題」まで踏み込んで解決しました。
「インストールしてもらう」を諦めた
手元にマウスが無い場面で使うツールなので、使いたい瞬間にアプリストアからのインストールを挟むと、その時点で目的を果たせません。そこでスマホ側の本命をブラウザ版にして、Windows側の受信アプリ(Receiver)に同梱・配信する形にしました。使う人がやることは、Receiverの画面に出たQRコードを標準のカメラアプリで読むことだけです。
一方で、Bonjourによる自動検出や触覚フィードバックなど、ブラウザでは扱えない機能を使いたい場合に向けてSwiftUI製のiOSアプリ版も用意しています。QRコードは両方で共通で、iOSアプリ側がURLをWebSocketのアドレスに読み替えて接続します。
合言葉とプロトコル番号で、つながらない事故を減らす
同じWi-Fiにいる誰でも繋がってしまうと、他人のPCのカーソルが動かせることになります。そのためReceiverは起動ごとに変わる合言葉(token)を要求し、合言葉なしのアドレスは拒否します。接続先の入手経路は、QRコード・Bonjourの自動検出・Receiver画面の表示の3通りです。
配布を続けるうちに問題になったのがバージョンの食い違いです。クライアントはReceiverがプロトコル2を返すことを要求するため、初期の配布版(v0.1.0、プロトコル1)では接続時に更新を促されて繋がりません。やっかいなのは、配布パッケージのファイル名に付くバージョンとコード側のバージョン値が独立していて、ファイル名だけでは判断できないことです。そこで稼働中のReceiverに直接問い合わせて実際の値を確認できるヘルスチェック用のURLを用意し、切り分けをそこに寄せました。
再接続を「使う人が何も考えなくていい」状態にする
一度読み取った接続先は保存され、Receiverが起動したままならアプリを開き直すだけで自動的に繋がります。Receiverを再起動して合言葉が変わった場合は、Bonjourで新しいReceiverを見つけ次第つなぎ直し、それでも見つからないときにだけQRコードの読み取りを案内します。
「まずQRを読んでください」と毎回出す作りは実装は簡単ですが、日常的に使うツールとしては煩わしいので、案内を出すのを最後の手段にしました。
マウスの代わりではなく、片手で完結する入力装置にする
カーソルを動かせるだけでは、結局PCの前まで行くことになります。そこで操作を増やし、スマホ側だけで一通りの作業が終わる形にしました。
- 1本指ドラッグでカーソル移動、タップで左クリック、ダブルタップでダブルクリック
- 2本指タップで右クリック、2本指の上下ドラッグでスクロール(右端のスクロールバーでも可)
- 長押しドラッグと「つかむ/離す」で、左ボタンを押したままの移動に対応
- 文字入力欄から文章をWindowsへ貼り付け、エンターまで送信。⌫は入力欄が空ならWindows側へBackspaceを送る
- Windows側のコピー/貼り付けをスマホのボタンから実行
- 亀〜兎のスライダーでカーソル感度を0.5〜3.0倍に調整
LAN内限定という割り切りと、配布後に出た問題
この仕組みはLAN内の接続専用で、Receiverをインターネットへ公開しない前提で設計しています。外から使える利便性より、他人にカーソルを奪われない安全側を取りました。
また、PyInstallerでexe化した配布物はWindows Defenderに誤検知されることがあります。動かない理由が分からないまま諦められてしまうため、検知されたときの対処まで配布物の説明に含めました。実装が終わってからが本番になる部分です。
Receiverはタスクトレイに常駐し、ウィンドウを閉じてもWindows右下のアイコンからQRコードを再表示できます。