Bigdra.Log

備忘録

ゲーム中のみマウス加速を無効にする常駐アプリを作る

背景

最近FPSゲームが流行っていますね。 私もApex LegendsやTitanFall2等をやっています。 このようなFPSゲームをマウスでプレイする場合、 マウスの加速設定を無効にすることが推奨される事が多いです。

マウス加速の設定が有効だと、 マウスを動かす速度によってポインタの移動量が変化してしまうため、 FPSでのエイム操作が不利になってしまうようです。

しかし、 私は普段のゲーム以外の作業ではトラックボールを使っており、 トラックボールにはマウス加速は必須だとも感じています。

https://s3.us-west-2.amazonaws.com/secure.notion-static.com/8cd50e90-4785-49ed-87a4-f5bf78ead142/CA0D8793-CFC6-4B9E-9F57-F102A1000180.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAT73L2G45O3KS52Y5%2F20201226%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20201226T235236Z&X-Amz-Expires=86400&X-Amz-Signature=e7b2f0d2c4a60dcc387694ab54d0204f066b8ba1cc385fa0daf20373ac5f5acf&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22CA0D8793-CFC6-4B9E-9F57-F102A1000180.jpeg%22

トラックボールでは親指でボールを転がしてマウスポインタを操作します。 ポインタを遠くまで動かしたいときに、 マウス加速が有効な場合はボールを勢いをつけて転がすことで1ストロークで目的の位置までポインタを動かすことができます。 (正確に届けるには慣れが必要ですが) ところが、 マウス加速が無効な場合はボールの速度に関わらずポインタの移動量が一定となるため、 遠くに動かすには数ストロークかかってしまいます。 そこで、 普段はマウス加速をON、 ゲーム中のみマウス加速をOFFにしたいと思いました。

現状

Windows10のマウス加速の設定は、 マウスのプロパティ/ポインターオプションポインターの精度を高める という項目で切り替えられ、 チェックを入れればマウス加速が有効になります。

https://s3.us-west-2.amazonaws.com/secure.notion-static.com/8de015f1-9210-4ea4-9dee-a0c32a541318/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAT73L2G45O3KS52Y5%2F20201226%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20201226T235308Z&X-Amz-Expires=86400&X-Amz-Signature=25d27988bac8847484031c6f8d2c759388d39bf5e6f960990a18e53c10c375d8&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22

この設定をゲームの起動時と終了時に切り替えればいいわけですが、 毎回手動でやるのも面倒なので自動化したいですね。

本題

Windowsアプリの開発はUnityでのゲームぐらいしかないので手探りで調べていきます。

最低限必要な機能は次の3つです。

  1. 常駐させる
  2. 特定のアプリが起動しているかを検出
  3. Windowsポインターの精度を高める 設定を切り替える

1はよくあるタスクトレイに常駐するアプリについて調べればよさそうです。

https://qiita.com/kob58im/items/8bca7a87890a66f8a425

2は System.Diagnostics.Process.GetProcessesByName() にプロセス名(メモ帳なら"notepad"、 Apex Legendsなら"r5apex")を渡せばそのプロセスが起動中か確認できるようです。

http://est-gw.hateblo.jp/entry/2016/01/16/202047

3はP/Invokeを介してネイティブ関数を呼び出す等しなければならないようで何もわかりません。

が、 同じことをやっている人はいました。

https://stackoverflow.com/questions/24737775/toggle-enhance-pointer-precision

とりあえず分からないものを継ぎ接ぎしながら目的の挙動をするものはできました。

https://github.com/bigdra50/ToggleMousePrecision/releases

まとめ

動くものはできたわけですが、 現時点では諸々を黒魔術的に組み合わせているだけの状態なのでそれぞれ詳しく調べた上で改善してまとめたいと思います。