AHK(AutoHotKey)のv2をwindows11に導入する

# はじめに
- ここ数年、会社外のPCとしてmacbookばかり使ってたけど、最近になって軽さにひかれて14インチで900gを切るpcを買ったので、久しぶりにwindowsを仕事以外で使い始めた。
- そこで、昔、x1carbonをメイン機としてた頃に大変お世話になった[AHK](https://www.autohotkey.com/)を使おうとしたらv2が登場してて、導入方法を簡単に紹介してくれるHPも見当たらなかったので、メモ代わりに投稿することとした。
- やりたいことは、複雑なことではなく、macbookで使っている「[BettertTouchTool](https://folivora.ai/)」的な使い方。
    - 具体的には、「無変換/変換キー」をCtrlキー代わりにして、いろいろなショートカットキーを自作したい。無変換/変換キーは、ご存じの通りwindowsではショートカットキーに使われることはないので、勝手にショートカットキーを自作してもバッティングする恐れがないから気が楽だし、なによりも親指のホームポジションにあるから、Ctrlキーなんかよりも、操作しやすい。
- 以前、x1carbonを使ってた頃はAHKのおかげで色々と楽できたけど、macbookでは「英数/かなキー」をCtrlキー代わりにした自作ショートカットを作れなかったから、残念だったよ。
    - まぁ、今回買った900g切りpcは、赤いトラックポイントがないから、ThinkPadに比べて、手をホームポジションに置いたままの作業は難しいだろうけど。

# ahkのインストール
- [公式サイト](https://www.autohotkey.com/)で、v2をダウンロードして、ダブルクリックするだけ。
- インストール後、下記が立ち上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/b1acfcb8-0ccd-aeb6-d747-0afc16f83506.png)
- 操作できるアプリとしては「Dash」（ダッシュボードの意味かな？）と「Spy」（これは、v1にも機能があったね）がインストールされるみたいで、上図は「Dash」の画面ということだね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/79c6a4d3-b37e-36a4-a438-83c7e2753785.png)
- 後述するけど、「Dash」「Spy」とも、全く使わなくても、ショートカット自作は可能です。もう、ahkのインストールは終わっているので、メモ帳とかでコードを書いて、.txtを.ahk拡張子に変えるだけで、出来上がりです。

# 説明サイト
- 本家が運営しているっぽい雰囲気です。日本語でも書かれているから安心です。

https://ahkscript.github.io/ja/docs/v2/Program.htm

- 詳しいことはこのサイトを見てほしいけど、本投稿では、何をやれば何が出来るかの雰囲気づかみまで出来るようにするね。
- ちなみに、「Dash」画面の右側の「Using the Program」をクリックすると、上記サイトの英語版と同じような内容が見れるよ。でも、日本語がないから、英語ができる人だけ代替可能だね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/d804e478-1a47-025e-5374-a75ff21eb2c1.png)


# はじめての実行
- とにかく、正常にインストールできたか試してみよう。「Dash」は立ち上がってなくてOK。
- 説明サイトの[下記ページ](https://ahkscript.github.io/ja/docs/v2/howto/RunExamples.htm)で、サンプルコードを取得できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/a8a0449a-2272-fa66-815b-d0855929a6c5.png)
- 赤矢印の先のボタンを押すと、下記の通り、ahk形式のファイルがダウンロードされる。
![explorer_aiMUlnAsEx.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/7a87755e-e234-c148-fdcc-96a88ac68761.jpeg)
- メモ帳で中を見れば、当然これだけ書かれている。`MsgBox "Hello, world!"`
- これをダブルクリックすると、スクリプトに従い、下記の画面が出る。
![AutoHotkey64_DfUs6Km0rB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/3293fa1b-e04c-359e-af97-91d72f20c101.jpeg)
- この画面が出ている間は、タスクトレイに緑の「H」マークが出ている。OKボタンを押すと、タスクトレイのHマークも消える。つまり、Hマークは、「スクリプト実行中ですよ！」ということ。
![mBOx7WJQ5b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/23e56409-a5ab-350b-0323-d49bb3144005.jpeg)
- また、このHマークを右クリックすると下記が表示される。v1と同じような感じだね。
![5GwXMpukfm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/41b448b7-ccdc-3cb7-1d3b-b951842ccb52.jpeg)
- ふむふむ、動作確認は出来たよ。
- でも、本来のやりたいことは、メッセージボックスにhello_worldすることじゃなく、自作ショートカットを作ることです。
- ここから先は、多少はコードの学習が必要なようだね。

# スクリプトの書き方のイメージ
- 説明サイトの[ここ](https://ahkscript.github.io/ja/docs/v2/howto/WriteHotkeys.htm)にこんなことが書いてある。
![msedge_u9s3EcPSNW.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/c014a048-cfd2-85c3-d415-562af3a950d5.jpeg)
- 上記に従うと、win+Nをホットキーとして、notepadを起動する場合は、こんな感じ。
```py
#n::Run "notepad"
```
- 少し高度化して、notepadが起動前か起動後かで行動を変える場合は、こんな感じ
```py
#n::
{
    if WinExist("ahk_class Notepad")
        WinActivate  ; 上記のウィンドウをアクティブにします。
    else
        Run "notepad"  ; メモ帳の新規ウィンドウを開く
}
```
- おぉ、これでイメージが掴めたね。
- また、ショートカットキーという呼び方でなくホットキーと呼ぶのが流儀とわかったよ。
- そして、ホットキー設定は、「#_winキー」+「nキー」＋「::ダブルコロン」＋「実行したいコード」
- ちなみに、[このページ](https://ahkscript.github.io/ja/docs/v2/howto/WriteHotkeys.htm)の下の方を見ると、winキー以外の対応も書いてあった。「一般的な修飾語は、Ctrl（^）、Alt（!）、Shift（+）、Win（#）です。」
- で、Ctrl等の、他のボタンと一緒に押すことが前提のキーなら、上記のようにホットキーを設定できるけど、単体で機能するキー同士でホットキーを作るときは、下記のような書き方をしないとダメと[同じページ](https://ahkscript.github.io/ja/docs/v2/howto/WriteHotkeys.htm)に書いてある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/591c88f8-343d-44ad-997f-bbd2e07bfae1.png)
- ふむふむ、このような組み合わせをカスタムコンビネーションと呼ぶのだね。
- また、本来、カスタムコンビネーションは3つ以上のキーを設定できないみたいだけど、下記の通り、#Hotifを使えば、3つでもいけるみたい。ちなみに、図の文章では「２つ以上のキー」って書いてあるけど、原文では「more than two」だから、２は含まないと思うよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/2665cb3b-6ac5-cbc4-0e6c-79eb7b33c84e.png)
- 最後に、最重要なコマンド「[Send](https://ahkscript.github.io/ja/docs/v2/lib/Send.htm) keys」を紹介するよ。と言っても、単純にキー送信を行うだけのコマンドだけどね。keysについては、以下のとおり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/03a5c9de-3548-5af0-8ae6-9824bd94b654.png)

- とりあえず、書き方のイメージはここまで！

# JISキーボードのスキャンコードとか
- キーを組み合わせるとき、winキーとnキーなら、「#n」だったけど、「変換キー」とかって、どうやって表現すればよいの？と思うだろうけど、そいつらは、スキャンコードで表現するのが、autohotkeyの流儀です。
- 有名どころのスキャンコードは以下の通り。

| キー | コード |
|:-:|:-:|
|変換   |sc079   |
|無変換   |sc07b   |
|カナ   |sc070   |
|半/全   |sc029   |
|英数   |sc03a   |

- もちろん、全てのキーはスキャンコードを持つよ。自分で確かめたい人は、[chgkey](https://forest.watch.impress.co.jp/library/software/changekey/)をインストールして調べてみて。AutoHotKeyにその機能があればいいんだけど、なぜか見つからないから、chgkeyを紹介するね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/f82d7b45-a414-b930-af06-4223c3b10cff.png)
- このソフトを立ち上げて、「調査」ボタンを押したら、「キーボードのキーを調べます」の画面が開くから、その状態で、何かのキーを押すと、スキャンコードが表示されるよ。AutoHotKeyで使うときは、下３桁の数字の頭に「sc」をつけて使って。
    - ちなみに、このchgkeyは、キーの入れ替えを簡単に行えて、しかも常駐しないアプリだから気に入ってる。レジストリを書き換えるだけのアプリだから、cpu負担なし！windowsマシンを買ったら、「カナキー」を「altキー」に入れ替えて、「applキー」を「winキー」に入れ替えるのがお気に入り。それに、でかいくせに使い道の低い「CapsLock/英数キー」を「Ctrlキー」にしたり、使わなくなった「半角/全角キー」を「escキー」にするのも良い。
- また、キーは、スキャンコード以外の「名前」でも表現できるよ、例えば、左矢印キーの名前は「Left」。詳しくは、[キー名称一覧](https://ahkscript.github.io/ja/docs/v2/lib/Send.htm#keynames)を見てね。

# 「Dash」を使ったエディタ起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/b1acfcb8-0ccd-aeb6-d747-0afc16f83506.png)
- AutoHotKeyでのホットキー作成は、「メモ帳」アプリでスクリプトを書いて、拡張子を.ahkにするだけで作れるけど、本来的には「Dash」でやるんだろうね。一応、「Dash」の画面の説明するけど、メモ帳とかで直接書くよ、という人は、本項目は読み飛ばしてね。
- 「Dash」を起動して、画面左上の「New Script」をクリックすると、下図が出るよ。
![スクリーンショット 2024-11-14 224753.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/87932724-a2c6-5136-2b16-704d238aefcd.jpeg)
- 画面を見ると、保存用フォルダはユーザー名直下のドキュメントフォルダに勝手に「AutoHotKey」フォルダが作られて、そこに入れることになるみたい。当然、画面右上にあるフォルダボタンを押せば、任意の場所を保存用フォルダに指定できる模様。
- 適当なファイル名をUntiledと書かれている欄に記入し、「Minimal for v2」を選択して、Editボタンを押すと、次の画面になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/c0b20329-f766-9b8c-8bfd-c12beeb7a36e.png)
- editor選択が出来るみたいだけど、「メモ帳」を選択すると、Command line にコマンドが埋め込まれるので、その後「OK」を押すと、メモ帳で「先ほど書いたファイル名.ahk」が開かれている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/413835d0-4ee9-baa4-0126-ce6ef77d6d96.png)
- つまり、ここまでの一連の流れは、エクスプローラー上で、「ファイル名.ahk」を新規作成して、メモ帳で開いたのと大差ない。「Minimal for v2」を選択して、Editボタンを押したため、メモ帳で開いたファイルの１行目に「#Requires AutoHotkey v2.0」が書かれているのがサービスって感じだろうか。この一行の意味はよくわからないけど、将来的に、v2.1のAutoHotKeyがでて、それ用のスクリプトが書かれたときは「#Requires AutoHotkey v2.1」と書いて、そのスクリプトを実行しようとしたPCにインストールされてるAuとHotKeyがv2.0だったときに、「v2.1がインストールされていません！」とか表示させるつもりなのかな？現時点では、不要っぽい文だね。

# ahkでホットキーを追加
- ここからやっと、本来やりたかったことの説明ができるよ。
- 昔よく使っていたホットキーとして、以下の二つがあったから、v2でも再現してみるね。
    - [変換]＋[i]：デスクトップ画面を左へ１つ進む
    - [変換]＋[o]：デスクトップ画面を右へ１つ進む
- 上記は、下記の通りタッチパッド４本指でのスワイプでもできるように設定しているし、macbookでも同じスワイプ動作にしているけど、ホームポジションから話すことになるから、少し嫌なんだよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/0021f2db-bd5c-53fc-d8f2-e849ca18bc7f.png)

- さて、じゃあ、コードを書いてみようか...おっと、そうだった。AutoHotKey用のコードは「スクリプト」と呼ぶのが流儀だった。
```py
~sc079 & i::Send("#^{Left}")
~sc079 & o::Send("#^{Right}")
```
- とりあえず、これで動いたよ。
    - ところで、「~：チルダ」を忘れずにね。これをつけないと、「変換キー」を普通に使うとき（例えば、「IMEオン割当て」で使用時）の機能が使えなくなるよ。

# おわりに
- AutoHotKeyは、高機能だけど、使いこなすにはそれなりの知識が必要。
- だけど、「変換キー」を有効活用する程度なら、上記のスクリプトで十分。
- この投稿が、みんなの利便性向上につながったら嬉しい。