マウススクロールで音量調整＋インジケータ機能を作る


IPFactory Advent Calender 2023 2日目の記事です。

https://qiita.com/advent-calendar/2023/ipfactory

今回はahk(AutoHotkey)で動くMouse Gesture Lを使って作った、個人的に便利なものを紹介しようと思います。

# はじめに ######################################################

今回作るものの動作はこんな感じです。
![動作の様子.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625507/9900a2b4-81d7-fe5b-6345-8b03fafd4f78.gif)



マウスの第４ボタンを押した状態でマウスホイールを回転させると、PCの音量調整と画面右下インジケーターによる音量確認ができる、といったものとなっています。

また3ボタンマウスでも、音量調整のトリガーを任意のボタンにすることが可能です。

- [>>完成品スクリプトだけ見たい人向け<<](https://qiita.com/sangoIPF/items/6e84a3cdc3532740143c#4%E5%AE%8C%E6%88%90%E5%93%81%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)

### 実行環境
OS: Windows11
ソフト: MouseGestureL.ahk Ver. 1.40 (2022/06/22)
マウス: ５ボタンマウス

# 0.MouseGestureLの導入 ######################################################

ダウンロードは[以下のサイト](https://hp.vector.co.jp/authors/VA018351/mglahk.html)から。

https://hp.vector.co.jp/authors/VA018351/mglahk.html

>【動作環境】(readmeより引用)
  MouseGestureL.ahkは、Unicode版のAutoHotkey上で動作します。
  Windows XP / 2003 / Vista / 7 / 8 / 10 / 11 (32-bit、64-bit両対応)

> <details><summary>インストール方法(readmeより引用)</summary>
>   解凍したファイルを任意のフォルダへコピーしてください。
>
>  ◆AutoHotkeyがインストールされている場合
>    MouseGestureL.ahkを起動してください。
>
>  ◆AutoHotkeyがインストールされていない場合
>    同梱の「Setup.vbs」を実行してください。AutoHotkeyをインストールすること
>    なくMouseGestureL.ahkを使用することが出来ます。
>    ポータブルで利用する場合も同様の手順で導入してください。
>
>  インストール後の使用方法はヘルプを参照してください。
>  アップデート時は全ファイルを上書きでコピーした後、トレイアイコンのメニュー内に
>  ある「再起動」を実行してください。
>  アンインストールはフォルダごと削除するだけです。レジストリは使用しません。
</details>



# 1.ジェスチャーの設定 ######################################################

タスクバーのインジケーターから設定画面を開き、
「ジェスチャー」タブで次のように操作します。
簡単です。

![スクリーンショット 2023-12-01 131556_small.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625507/460776c2-825f-5406-492b-5c25461bcc3d.png)

もしくは、以下のコードをコピーし画面左下「クリップボードからインポート」でも可能です。
```:音量アップ/ダウン
[SoundVolume_Up]
G=X1B_WU_

[SoundVolume_Down]
G=X1B_WD_
```

### 手順
- 左上「追加」ボタンでジェスチャーを追加
- ジェスチャー名を変更（今回は`SoundVolume_Up`を設定しました）
- 第４ボタン→ホイール上回転 をダブルクリックで追加（直接編集もできます）
- 中央付近「追加」ボタンで登録

こうして音量アップのジェスチャー`X1B_WU_`を登録できたかと思います。
トリガー変更はこの`X1B_`の部分を変えてください。
ちなみに第６ボタン以降の登録は、すこし手間がかかりそうです..

ついでに音量ダウンのジェスチャーも作ってしまいましょう

# 2.音量調整機能 ######################################################

次はauto hotkeyの言語で音量調整を書いていきます。
ここも簡単です。

ジェスチャー一覧から先ほどのSoundVolume_UpとDownを追加し、それぞれアクションスクリプトに入力します。_保存時は「適用」→「OK」を忘れずに！_
```:SoundVolume_Up
;ボリューム+2
SoundSet, +4, MASTER, VOLUME
```
```:SoundVolume_Down
;ボリューム-2
SoundSet, -4, MASTER, VOLUME
```

これで、ホイールを回すとPCの音量が変わっていることが確認できたかと思います。

音量を変えるだけなら簡単ですね。
ここではスクロール毎、4%単位で音量を変えています。もちろんカスタム可。

次からがこだわったポイントです。


# 3.音量インジケータ機能 ######################################################

本題です。

### 音量を取得
インジケーターを作るにあたって、まず現在音量の取得をします。
```:Up/Down共通
;MASTERボリュームを取得、変数OutputVarに代入し、四捨五入
SoundGet, OutputVar, MASTER
OutputVar := Round(OutputVar)
```

### 表示
表示にわざわざウィンドウなんぞ使わないので、ツールチップを使用します。

1. ツールチップの出現座標の基準値を[CoordMode](https://ahkwiki.net/CoordMode)で指定
1. [ツールチップ](https://ahkwiki.net/ToolTip)を表示 pyで言うところの`f'音量：{OutputVar}%'`を、指定座標に表示する

```:Up/Down共通
CoordMode, ToolTip, Screen
ToolTip, 音量：%OutputVar%`%, 3000, 2000
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625507/2194e26d-cca8-565d-65f8-27bea6e07684.png)

ついに画面右下に表示が！
でも消えませんね。

### タイマー・時間経過で消去

1. "RemoveToolTip"という、ツールチップを消去=空にする処理を作成
1. [SetTimer](https://ahkwiki.net/SetTimer)を使い、1.5秒後にRemoveToolTipを実行するよう設定
1. またタイマーが継続して動くよう、[#Persistent](https://ahkwiki.net/-Persistent)を記述し常駐モードにする。

```:Upのみ
#Persistent
CoordMode, ToolTip, Screen
ToolTip, 音量：%OutputVar%`%, 3000, 2000
SetTimer, RemoveToolTip, 1500
Return

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
Return
```
```:Downのみ
#Persistent
CoordMode, ToolTip, Screen
ToolTip, 音量：%OutputVar%`%, 3000, 2000
SetTimer, RemoveToolTip2, 1500
Return

RemoveToolTip2:
SetTimer, RemoveToolTip2, Off
ToolTip
Return
```

UpとDownで内容を少し変えました。
これは、UpとDownで消去タイマー用関数の名前とを分けているだけです。
何かが競合するらしく、エラーが起きることによる処置です。

これで、無事にインジケーターを閉じることができました。

# 4.完成品・おわりに ######################################################

最終的に完成したコードはこちらになります。
利用・改変はご自由に！
```:SoundVolume_Up
;ボリューム+2
SoundSet, +4, MASTER, VOLUME

SoundGet, OutputVar, MASTER
OutputVar := Round(OutputVar)

#Persistent
CoordMode, ToolTip, Screen
ToolTip, 音量：%OutputVar%`%, 3000, 2000
SetTimer, RemoveToolTip, 1500
Return

RemoveToolTip:
SetTimer, RemoveToolTip, Off
ToolTip
Return
```
```:SoundVolume_Down
;ボリューム-2
SoundSet, -4, MASTER, VOLUME

SoundGet, OutputVar, MASTER
OutputVar := Round(OutputVar)

#Persistent
CoordMode, ToolTip, Screen
ToolTip, 音量：%OutputVar%`%, 3000, 2000
SetTimer, RemoveToolTip2, 1500
Return

RemoveToolTip2:
SetTimer, RemoveToolTip2, Off
ToolTip
Return
```

この記事をご覧いただき、ありがとうございます。
いかがだったでしょうか。自分はこの機能のおかげで曲の音量を瞬時に変えられてQOL爆上がりしたので、ぜひ皆様にもこんな可能性を知ってほしいと思い書かせていただきました。

### Mouse Gesture Lはいいぞ。

コード画面のプリセットにあるahkコードだけでも、**簡単**に便利な機能を作れてしまいます。
- ブラウザ上でマウスを**ドラッグ**するだけで、`Ctrl+Tab`や`Ctrl+Shift+Tab`を発生させ**タブ切替**、とか。
- 右クリックと中クリック同時押しで、曲や動画を**再生/一時停止**、とか。
- カーソルを画面右端に当てて**シャカシャカ**するだけで、`Ctrl+Win+Right`で**仮想デスクトップ**を左右に動き回れたり、とか。

今回のを除けば、最後のが一番便利です。特にデュアルモニタがないノートでは！
ならびにこれを動かしているAutoHotkey自体も、いつかは使いこなせるようになってみたい。

どうやら先駆者様が、こうした便利機能の豊富なアイデアをまとめてくださっているみたいです。

https://qiita.com/ryoheiszk/items/81fa857c7b2b1386c5a3#%E5%88%9D%E7%B4%9A

## ※うまくいかない場合

- **UpとDownで全く同じスクリプトを入れた**
    - タイマー処理の名前の重複が起こっているかもしれません。
- **ツールチップの座標設定**
    - 画面外かもしれません。設定解像度より130px左、20px上に設定するのがオススメです。
- **ジェスチャの末尾の`_`が多い**
    - 一つ多いと、「第四ボタンを離す」までが一連のトリガーと認識されてしまいます。

---

なにか気になる点などありましたら、どうぞお気軽にご指摘いただければ幸いです。
ありがとうございました！

> コードを書くにあたって参考にしたサイト
> AutoHotkey 非公式ドキュメンテーションWiki　https://ahkwiki.net/Commands_Category