- C# 98.5%
- PowerShell 1.5%
| .codex/agents | ||
| docs | ||
| Interop | ||
| Models | ||
| Resources | ||
| Services | ||
| tests | ||
| .gitignore | ||
| App.xaml | ||
| App.xaml.cs | ||
| icon_base-transparent.png | ||
| icon_base.png | ||
| KazaguruMouse.csproj | ||
| MainWindow.xaml | ||
| MainWindow.xaml.cs | ||
| README.md | ||
かざぐるマウス Modern
Windows 10/11 (x64) 向けの、常駐型・日本語 WPF マウス操作ユーティリティです。これは旧版作者のリリースを再配布するものではなく、公開されていた機能を参考にした独立実装です。
ビルドと実行
dotnet build .\KazaguruMouse.csproj -c Release
dotnet run --project .\KazaguruMouse.csproj -c Release -- --self-test
dotnet run --project .\KazaguruMouse.csproj -c Release
--startup は UI を表示せず通知領域から開始します。--self-test はグローバルフックをインストールせず、決定的なテスト結果を出力します。
診断ログ
v1.2.9 以降は %LOCALAPPDATA%\KazaguruMouseModern\logs\diagnostics-<UTC日時>-<PID>.jsonl に診断ログを自動保存します。1行1イベントの JSON で、UTC時刻・稼働時間・PID・管理/ネイティブスレッドIDを記録します。専用スレッドで書き込み、入力フックはディスクを待ちません。キューは2048件、ログは1ファイル2MiBで2世代にローテーションし、起動時に古いセッションを削除して最大20ファイル程度に保ちます。過負荷で破棄した件数も記録します。
process.start/ready/exit_requested/cleanup/exit、tray.created/dispose:起動、通知領域生成、終了理由と終了処理。process.exitがなく記録が途切れた場合は、異常終了・強制終了などの可能性があります。process.health:5秒ごとのUI応答経過時間、スレッド数、ハンドル数、メモリー量。ThreadPoolが停滞しても専用のログスレッドが記録します。hook.health:15秒ごとのフック/制御メッセージの応答、処理中の段階、捕捉状態、一時停止・除外・再接続待ち。操作していないときの入力通知の経過時間は異常ではありません。gesture.*、button.*、command.*:認識した方向/ボタン、カタログのコマンドID、対象HWND/PID、識別・前面確認、実行結果。文字入力、ポインター座標、ウィンドウタイトル、選択テキスト、クリップボード内容、外部コマンド引数、カスタムキーの内容は記録しません。native.send_input.begin/result/end、operation.stalled:入力送信の呼び出し元、要求/送信数、Win32エラー、対応する操作番号。2秒以上完了しない処理は5秒ごとの監視で名前・経過時間・元のスレッドを記録します。完了していないcommand.executeにinput_gate_acquiredがなければ実行待ち、入力送信のbeginだけが残れば送信中の停滞を調べます。hook.dispose.cleanup_wait/join:終了通知への応答とスレッド終了待ちの結果。終了待ちがタイムアウトした状態や、残留スレッドの調査に使用します。*.exception、process.fatal:例外の型、HRESULT、スタック。例外メッセージは内容漏洩を避けるため記録しません。ネイティブの致命的障害などで実行できない場合は、Windowsの Application Error / .NET Runtime / Windows Error Reporting も併せて確認します。ログだけで他プロセスやカーネル内の待機原因まで断定はできません。
正常終了の確認や更新時には KazaguruMouse.exe --shutdown で同じユーザーの起動中インスタンスへ終了を要求できます。終了完了はプロセスの消失と process.exit を確認してください。実際の Windows フックを解除して復旧を検証する回帰テストは powershell -File .\tests\HookRecoveryTests.ps1 で実行できます。
設定は %LOCALAPPDATA%\KazaguruMouseModern\settings.json に JSON で保存されます。保存は一時ファイルから置換し、壊れたファイルは .corrupt-<timestamp> として退避します。Windows 起動時チェックは HKCU の Software\Microsoft\Windows\CurrentVersion\Run のみを変更し、管理者権限を要求しません。
通知領域アイコンは常に 1 個です。左クリックで設定を開き、メニューから一時停止/再開、隠したウィンドウの復元、バージョン情報、終了を選べます。閉じる・最小化は設定によりトレイへ隠せます。
セキュリティと制限
低レベルマウスフックは専用 STA スレッドで処理し、コールバック内ではディスク I/O や UI 待機を行いません。SendInput には専用 sentinel を付与し、自身の入力だけを無視します。管理者権限ウィンドウは UIPI により操作できない場合があります。外部コマンドは設定で明示的に有効化した場合だけ UseShellExecute=true で起動します。ドライバー、サービス、ネットワーク、テレメトリ、自動更新はありません。
Windows 11 のタスクバー再配置、タスクボタンのホバー、Explorer 内部拡張は非公開実装のため提供しません。旧 Windows のシェル内部を再現するものではありません。
ブラウザーとファイル エクスプローラー
ブラウザー向けのショートカットのうち、公開ショートカットで同じ意味を持つ Back、Forward、Reload、CloseTab、PreviousTab、NextTab、NewTab、NewWindow、Fullscreen は、標準の Windows 11 ファイル エクスプローラー(explorer.exe のトップレベル CabinetWClass)が前面のときにも実行します。デスクトップ、タスクバーなどの Explorer シェル面は対象外です。
ReopenClosedTab はブラウザーでは従来どおり Ctrl+Shift+T を送りますが、ファイル エクスプローラーには信頼できる公開ショートカット/API がないため送信せず、非対応であることを通知します。DuplicateTab もファイル エクスプローラーには有効化していません(Explorer では安全な NewTab を使用してください)。
Notepad++ とポインター対象
Notepad++(notepad++.exe、トップレベルクラス Notepad++)は、既定ショートカットが公開されている NewTab(Ctrl+N)、CloseTab(Ctrl+W)、ReopenClosedTab(Ctrl+Shift+T)、NextTab(Ctrl+Tab)、PreviousTab(Ctrl+Shift+Tab)、Reload(Ctrl+R)だけを対象にします。Back/Forward、新しいウィンドウ、複製、ズーム、ブックマーク、ソース表示などブラウザー専用項目は送信しません。Notepad++ のショートカットはユーザーが変更できるため、設定を変更している環境では期待どおりにならない場合があります。
ジェスチャーおよび割り当てた中/サイドボタンは、入力開始位置のトップレベルウィンドウを PID とプロセス起動時刻を含む強い識別情報で捕捉します。対象が前面でなければ通常の SetForegroundWindow と短い確認を行い、確認できた場合だけショートカットを SendInput します。対象の再利用、消失、フォーカス喪失、UIPI 拒否などの検証失敗時は入力を送信しません。
通常アプリの CloseTab は、強い識別、通常アプリ分類、前面化、最終検証をすべて通過した場合だけ WM_CLOSE にフォールバックします。これは標準の閉じる要求なので、アプリ本来の保存確認を表示できます。ブラウザー、File Explorer、Notepad++ はそれぞれの Ctrl+W を使用し、フォールバック対象外です。