【AutoHotKey】同じキーを押す度に、機能を切り替える方法
この記事では、キーに別の機能を割り当てるソフト「AutoHotkey」で、同じキーを押す度に、別々の機能を発動させる方法について書きます。
例えば、F1に、コピーと貼り付けの2つを割り当てるといったことが可能です。
AutoHotKeyで、「Flag += 1」を使うことで、1つのキーに別々の機能を割り当てられます。
例えば、以下の感じです。同じF1なのに、フラグが何回目かで動作を変えられます。フラグは、2個でも10個でも増やせます。増やした分だけ、機能を追加できます。
F1を押した時 | 発動する機能 |
---|---|
1回目 | Ctrl+C |
2回目 | Ctrl+V |
「同じキーで、押す度に別の機能を呼び出したい!」という方、参考にしてみてください。形さえマスターすれば、色々応用が利きます。「#IfWinActive」などの他の応用技とも併用できます。
本記事は、既にAutoHotKeyをインストールしている前提です。
本記事に関わらず、当サイトのAutoHotKey記事は、全部初心者である僕が書いています。よって、ベテランさんが見ても参考にならないと思います。初心者の僕が、忘れないようにメモしている…という体で見ていただければ幸いです。理解も浅いです。
同じキーを押す度に、機能を切り替えるAutoHotKeyコード
サンプルコード1(2回で切り替え)
サンプルコードを見たほうが覚えやすいと思うので、完成状態のコードを貼ります。F1を押すたびに、コピペを切り替えるコードです。
;F1を押すたびに、Ctrl+CとCtrl+Vを切り替える
F1::
Flag += 1 ;判定用に変数に加算していく
If Flag = 1 ;判定が1の時
{
Send, ^c ;Ctrl+Cを押したことにする
Return
}
If Flag = 2 ;判定が2の時
Send, ^v ;Ctrl+Vを押したことにする
Flag = ;変数を空にして1回目に戻る
Return
とりあえず、上記をコピペして、動作チェックしてみるといいかなと思います。
AutoHotKeyファイルに書き込んで、上書き保存→実行します。既に実行しているAutoHotKeyファイルに書き込んだ場合は、タスクトレイのアイコンを右クリック→「Reload This Script」をクリックします。
適当に、文字を範囲選択してF1を押します。この時、文字がコピーされます。そのあと別の場所で、再度F1を押します。この時は、文字が貼り付けられます。同じキーなのに、「Flag(フラグ)」が何回目かで動作を変えられます。
実際に使ってみた動画を貼っておきます。
サンプルコード2(4回ごとで切り替え)
1つ目に紹介したコードは、Ctrl+CとCtrl+Vの2つの切り替えです。下記のように、どんどんフラグを増やすことで、機能を追加できます。
;F1を押すたびに、ダイアログで任意のメッセージを表示する
F1::
Flag += 1 ;判定用に変数に加算していく
If Flag = 1
{
MsgBox,1回目 ;判定が1の時
Return
}
If Flag = 2
{
MsgBox,2回目 ;判定が2の時
Return
}
If Flag = 3
{
MsgBox,3回目 ;判定が3の時
Return
}
MsgBox,4回目 ;判定が4の時
Flag = ;変数を空にして1回目に戻る
Return
いい感じのサンプルが思いつかなかったので、参考リンクのサンプルコードをお借りして、発動キーをF1にしました。
なお、最初に紹介したコピペコードとは併用できません。発動キーが同じF1だからです。テストで使いたい場合は、一度どちらかを削除してからにしましょう。
今回のコードだと、F1を押す度にダイアログが表示されます。中身の内容が、Flagごとで設定した内容になっています。1回目なら、「1回目」、3回目なら「3回目」と表示されるはずです。
合計で4回までメッセージが変わって、それ以降は1回目に戻ります。4回の切り替えですね。
「MsgBox,〇〇〇」が、任意の内容を記述したメッセージボックスを表示するって意味です。実用では、あんまり使わないかもしれません。
「#IfWinActive」との併用
「#IfWinActive」は、特定のウィンドウ・アプリだけで発動するという意味です。
このコードと併用することで、例えば、Chromeが起動している時だけ、F1の1回目をCtrl+Home(ページの最上部に移動)、2回目をCtrl+End(ページの最下部に移動)にすることが可能です。
;Chrome
#IfWinActive, ahk_exe chrome.exe
;F1を押すたびに、Ctrl+HomeとCtrl+Endを切り替える
F1::
Flag += 1 ;判定用に変数に加算していく
If Flag = 1 ;判定が1の時
{
Send, ^{home} ;Ctrl+Homeを押したことにする
Return
}
If Flag = 2 ;判定が2の時
Send, ^{end} ;Ctrl+Endを押したことにする
Flag = ;変数を空にして1回目に戻る
Return
#IfWinActive
パッと見難しそうですが、単に、1番目に紹介したフラグの型を、「#IfWinActive」でサンドイッチしているだけです。
これで、Chromeがアクティブになっている時だけ、F1が指定した動作をするようになります。ページの最上部に移動、もう一回押すと、ページの最下部に移動します。僕が今適当に考えただけなので、実用性は皆無です。
特定のウィンドウ…といえば、他にも「GroupAdd」というのがあります。これは、複数ウィンドウを対象にできる機能です。ChromeとEdgeがアクティブの時に、発動させる…といった感じです。
SetTitleMatchMode, 2
;testグループ
GroupAdd, test, ahk_exe chrome.exe ;Chrome
GroupAdd, test, ahk_exe msedge.exe ;Edge
;testグループ
#IfWinActive, ahk_group test
;F1を押すたびに、Ctrl+HomeとCtrl+Endを切り替える
F1::
Flag += 1 ;判定用に変数に加算していく
If Flag = 1 ;判定が1の時
{
Send, ^{home} ;Ctrl+Homeを押したことにする
Return
}
If Flag = 2 ;判定が2の時
Send, ^{end} ;Ctrl+Endを押したことにする
Flag = ;変数を空にして1回目に戻る
Return
#IfWinActive
ポイントですが、「GroupAdd」でグループを作る時は、なるべく上のほうに記述します。下のほうだとうまく動作しない時があります。
グループを呼び出すコードは、下のほうでもOKです。上記コードだと、「GroupAdd, test, ahk_exe chrome.exe」とかを先頭のほうに書けってことですね。
なお、1行目の「SetTitleMatchMode, 2」は、有無を言わさず、先頭らへんに書きます。ウィンドウタイトルのマッチ方法を、中間一致にするという意味です。意味は理解してなくても、GroupAddを使うなら、書いたほうがいいかなと思います。
今回のコードの初心者つまづきポイント
いくつか、初心者の僕がつまづいたポイントを書きます。
適度な改行が必要
今回のコード、なんだかんだ縦に長いですよね。「もっと少ない行数で表示したい!」と思い、あれやこれや試してみました。結果、以下のことが分かりました。
- 「Flag = 〇」のあとに括弧はつけない
- 「Return」のあとに括弧はつけない
以下がダメな例です。
;ダメな例(エラーが出ます)
F1::
Flag += 1
If Flag = 1{
Send, ^c
Return}
If Flag = 2
Send, ^v
Flag =
Return
上記コードを実行しようとしても、エラーが出ます。
理由は、「If Flag = 1」と「Return」の後に括弧があるからです。これだとうまく動作しません。
一方で、以下のコードはうまく動作しました。「Send, ^c」の前に「{」記号を入れています。IfとReturnの行になかったら、多分OKです。
F1::
Flag += 1
If Flag = 1
{Send, ^c
Return
}
If Flag = 2
Send, ^v
Flag =
Return
Sendのあとの書き方に注意
これは、今回の話に限ったことじゃないですが、Sendのあとは注意です。良い例と悪い例を書きます。どちらも、Ctrl+Homeを指定している想定です。
;良い例
Send, ^{home}
;悪い例
Send, ^home
「home」に中括弧(なかかっこ)があるかないかですね。
基本的に、1文字で表せないキーは、中かっこが必要です。F5や、PageUpなどですね。
ややこしいんですが、CtrlやWindowsキーは、1文字じゃないですよね。しかし、修飾キーといって、「^」や「#」で表せます。修飾キーについては、ネットで「AutoHotKey 修飾キー 一覧」って感じで調べてみてください。
今回の場合は、homeの前にある「^」がCtrlという意味です。
実を言うと、悪い例のほうも、エラーは出ません。書き方としては間違っていないからです。ただし、homeキーとしては認識してくれません。
「home」という文字で認識されるはずです。メモ帳かなにかで試したら、そのまま「home」と入力されます。「こんにちは」といった感じで、文章を入力したいなら、あえて中かっこを書かないで、そのまま文章入力しましょう。
今回は、homeをキーとして認識してほしかったので、中かっこが必要だったということです。なお、冒頭の「F1::」には必要ありません。入力元につけるとエラーが出ます。
最後のFlag(フラグ)には、かっこを付けない
以下のように、最後の「If Flag = 〇」を、中かっこで囲んだらいけません。
;悪い例(エラーは出ないけど間違っている)
F1::
Flag += 1
If Flag = 1
{
Send, ^c
Return
}
If Flag = 2
{
Send, ^v
Return
}
Flag =
Return
比較画像を貼っておきます。左側が本記事の1番目に紹介したコードで、右側が、最後のフラグに括弧を付けたコードです。悪い例のほうも、エラーは吐き出しません。
パッと見たら、全ての「If Flag = 〇」を中かっこで囲むという統一されたルールができるので、便利かもしれません。
しかし、僕の環境だと、以下のように、2回切り替えのはずが、何も発動しない謎の3回目が入ってしまいました。
- 1回目
- 2回目
- 何も発動しない謎の3回目
- 1回目…(以下ループ)
なんとなくの理由は分かります。中かっこを付けるために、一緒につけた「Return」が原因だと思います。「Return」を2回目の最後に入れているせいで、何も発動しない回が誕生しちゃっているんだと思います。
試しに、「Return」をなくして、中かっこだけにしたら、うまく動作しました。ただ、「Return」をなくしていいのか分からなかったため、結局、最後のフラグには、そもそも中かっこを入れないほうがいいという考えに至りました。
;うまく動作するけど、合っているのか分からない例
F1::
Flag += 1
If Flag = 1
{
Send, ^c
Return
}
If Flag = 2
{
Send, ^v
}
Flag =
Return
感想
以上、AutoHotkeyで、特定のキーを押す度に、動作を切り替える方法でした。
たまにAutoHotKey関連で、僕に質問をしてくださる方がいるのですが、残念でした。僕は、AutoHotKey初心者なので、ほぼ答えられません。僕に聞くより、ネットで調べたほうが、簡単に答えにたどり着くと思います。