【AutoHotKey】同じキーを押す度に、機能を切り替える方法

AutoHotkey

AutoHotkeyのアイコン

この記事では、キーに別の機能を割り当てるソフト「AutoHotkey」で、同じキーを押す度に、別々の機能を発動させる方法について書きます。

例えば、F1に、コピーと貼り付けの2つを割り当てるといったことが可能です。

【AutoHotKey】同じキーを押す度に、機能を切り替える方法

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

とりあえず、上記をコピペして、動作チェックしてみるといいかなと思います。

Visual Studio Codeのスクリーンショット

AutoHotKeyファイルに書き込んで、上書き保存→実行します。既に実行しているAutoHotKeyファイルに書き込んだ場合は、タスクトレイのアイコンを右クリック→「Reload This Script」をクリックします。

適当に、文字を範囲選択してF1を押します。この時、文字がコピーされます。そのあと別の場所で、再度F1を押します。この時は、文字が貼り付けられます。同じキーなのに、「Flag(フラグ)」が何回目かで動作を変えられます。

実際に使ってみた動画を貼っておきます。

サンプルコード2(4回ごとで切り替え)

1つ目に紹介したコードは、Ctrl+CCtrl+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

参考:サンプルコード集 – AutoHotkey Wiki

いい感じのサンプルが思いつかなかったので、参考リンクのサンプルコードをお借りして、発動キーをF1にしました。

なお、最初に紹介したコピペコードとは併用できません。発動キーが同じF1だからです。テストで使いたい場合は、一度どちらかを削除してからにしましょう。

今回のコードだと、F1を押す度にダイアログが表示されます。中身の内容が、Flagごとで設定した内容になっています。1回目なら、「1回目」、3回目なら「3回目」と表示されるはずです。

合計で4回までメッセージが変わって、それ以降は1回目に戻ります。4回の切り替えですね。

AutoHotKeyでメッセージボックスを出現させた画像

「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でもOK

特定のウィンドウ…といえば、他にも「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

上記コードを実行しようとしても、エラーが出ます。

「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などですね。

ややこしいんですが、CtrlWindowsキーは、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番目に紹介したコードで、右側が、最後のフラグに括弧を付けたコードです。悪い例のほうも、エラーは吐き出しません。

最後のFlag(フラグ)に括弧を付けた悪い例と、つけなかった良い例の比較画像

パッと見たら、全ての「If Flag = 〇」を中かっこで囲むという統一されたルールができるので、便利かもしれません。

しかし、僕の環境だと、以下のように、2回切り替えのはずが、何も発動しない謎の3回目が入ってしまいました。

  1. 1回目
  2. 2回目
  3. 何も発動しない謎の3回目
  4. 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初心者なので、ほぼ答えられません。僕に聞くより、ネットで調べたほうが、簡単に答えにたどり着くと思います。

Posted by ナポリタン寿司