ホットキー(マウス、コントローラー、キーボードショートカット)

目次

導入と簡単な例

ホットキーは、アクション(プログラムの起動やキーボードマクロなど)を簡単に起動できることから、ショートカットキーと呼ばれることもあります。次の例では、ホットキーWin+Nがメモ帳を起動するように設定されています。ポンド記号[#]はWinの略で、修飾キーと呼ばれるものです:

#n::
{
    Run "notepad"
}

上記では、中括弧はホットキーの関数体を定義する役割を果たします。また、OTB(One True Brace)スタイルをサポートするために、ダブルコロンと同じ行に開始ブレースを指定することができる。ただし、ホットキーが1つの行だけを実行する必要がある場合は、その行をダブルコロンの右側にリストアップすることができます。つまり、中括弧は暗黙の了解なのです:

#n::Run "notepad"

ホットキーがトリガーされると、ホットキーの名前がThisHotkeyという最初のパラメータとして渡されます(末尾のコロンは除外されます)。事例:

#n::MsgBox ThisHotkey  ; レポート #n

一部の例外を除き、組み込み変数A_ThisHotkeyと同様です。パラメータ名は、名前付き関数を使用することで変更することができます。

1つのホットキーで複数のモディファイアを使用する場合は、連続してリストアップしてください(順番は関係ありません)。次の例では、Ctrl+Alt+Sを示すために^!sを使用しています:

^!s::
{
    Send "Sincerely,{enter}John Smith"  ; この行は、アクティブ(最前面)ウィンドウにキーストロークを送信します。
}

ホットキーモディファイアの記号

以下の修飾記号を使用して、ホットキーを定義:

記号 説明
#

Win (ウィンドウズロゴキー)。

Winを含むホットキー(例:#a)は、Lのキーストロークを含むテキストを送信する前に、Winが解除されるのを待ちます。これにより、このようなホットキー内で送信を使用した場合、PCがロックされるのを防ぐことができます。この動作は、SendPlay(不要)、ブラインドモードテキストモード以外のすべての送信モードに適用されます。

注: Winを含むホットキーを押すと、余分なシミュレーションキー(デフォルトではCtrl)を押すことになる場合があります。A_MenuMaskKeyを参照。

!

Alt

注: Altを含むホットキーを押すと、余分なシミュレーションキー(デフォルトではCtrl)が発生する場合があります。A_MenuMaskKeyを参照。

^ Ctrl
+ Shift
& アンパサンドは、任意の2つのキーまたはマウスボタンの間に使用し、カスタムホットキーに結合することができます。詳しくは下記をご覧ください。
< ペアの左キーを使用します。例:<!a は、左Altだけがトリガーになることを除けば、!a と同じです。
> ペアのうち右側のキーを使用します。
<^>!

AltGrオルタネートグラフ、代替グラフィック)。キーボードレイアウトに右Altキーの代わりにAltGrがある場合、この一連の記号は通常AltGrを表すために使用することができます。事例:

<^>!m::MsgBox "You pressed AltGr+m."
<^<!m::MsgBox "You pressed LeftControl+LeftAlt+m."

また、AltGr自体をホットキーにするには、以下のホットキーを使用します(上記のようなホットキーが存在しない状態):

LControl & RAlt::MsgBox "You pressed AltGr itself."
*

ワイルドカード:余分なモディファイアが押されていても、ホットキーを発射します。キーやボタンのリマッピングとセットで使われることが多いです。事例:

*#c::Run "calc.exe"  ; Win+C、Shift+Win+C、Ctrl+Win+Cなど、すべてこのホットキーがトリガーされます。
*ScrollLock::Run "notepad"  ; 修飾キーが押されていても、ScrollLockを押すとこのホットキーが起動します。

ワイルドカードホットキーは、ワイルドカードホットキーに取って代わられたホットキーと同様に、常にキーボードフックを使用します。例えば、*a::があると、^a::は常にフックを使用するようになります。

~

ホットキーが起動しても、そのキーのネイティブ機能はブロックされない(システムから隠される)。以下の例では、いずれもユーザーがマウスボタンをクリックすると、アクティブウィンドウに送信されます:

~RButton::MsgBox "You clicked the right mouse button."
~RButton & C::MsgBox "You pressed C while holding down the right mouse button."

他の接頭語記号と異なり、チルダ接頭語は、ホットキーのいくつかのバリエーションに存在し、他のバリエーションには存在しないことが許されています。ただし、オフやサスペンドされていないカスタムコンビネーションのプレフィックスキーにチルダを適用すると、すべてのコンビネーションに対してそのプレフィックスキーの動作に影響を与えます。

alt-tabの代用となる特殊なホットキーは、常にチルデの接頭辞を無視します。

ホットキーとして使用されるカスタム修飾キー(プレフィックスキー)にチルダプレフィックスを適用した場合、そのホットキーはキーを離すまで遅延されるのではなく、キーを押したときに起動するようになります。例えば、上記の~RButtonのホットキーは、ボタンが押されるとすぐに起動します。

チルダ接頭辞がカスタムコンビネーションにのみ適用され、コンビネーション以外のホットキーには適用されない場合、そのキーのネイティブ機能はブロックされたままとなります。例えば、以下のスクリプトでは、Menuを押すと、ツールチップが表示され、コンテキストメニューは起動しません:

AppsKey::ToolTip "Press < or > to cycle through windows."
AppsKey Up::ToolTip
~AppsKey & <::Send "!+{Esc}"
~AppsKey & >::Send "!{Esc}"

キーボードホットキーの少なくとも1つのバリエーションがチルダ修飾子を持つ場合、そのホットキーは常にキーボードフックを使用します。

$

これは通常、スクリプトがSend関数を使用してホットキーそのものを構成するキーを送信する場合にのみ必要で、そうでない場合はそれ自体がトリガーされる可能性があります。接頭辞の$は、このホットキーの実装にキーボードフックを使用することを強制し、副作用としてSend関数がトリガーするのを防ぎます。$ 接頭辞は、#UseHookを指定したのと同じです。 このホットキーの定義の上のどこかにあります。

$ 接頭辞は、マウスホットキーは常にマウスフックを使用するため、$ 接頭辞はマウスホットキーには影響しません。また、チルダ(~)またはワイルドカード(*)修飾子を持つキーボードホットキー、キーアップホットキー、カスタムコンビネーションなど、すでにキーボードフックを必要としているホットキーには効果がありません。特定のホットキーがキーボードフックを使用しているかどうかを判断するには、ListHotkeysを使用します。

#InputLevelSendLevelは、Send関数によってトリガーされるホットキーとホットストリングをさらにコントロールすることができます。

UP

ホットキーの名前の後にUPという単語を付けると、キーを押したときではなく、キーを離したときにホットキーが起動するようにすることができます。次の例では、左Winを左Ctrl再マッピングしています:

*LWin::Send "{LControl down}"
*LWin Up::Send "{LControl up}"

「Up」は、この例のように通常のホットキーでも使用することができます:^!r Up::MsgBox "You pressed and released Ctrl+Alt+R"組み合わせホットキー(例:F1 & e Up::)でも動作します

制限:1) "Up"はコントローラーのボタンでは動作しない。2) "Up"ホットキーに対応する通常のホットキー/ダウンホットキーがない場合、そのキーが完全に引き継がれ、押したままになるのを防ぐ。これを防ぐ一つの方法は、チルダの接頭辞を付けることです(例えば、~LControl up::

"Up"ホットキーとそのキーダウンの対応するもの(ある場合)は、常にキーボードフックを使用します。

これに関連して、上記と似た手法として、ホットキーをプレフィックスキーにする方法があります。この利点は、ホットキーは離すと起動しますが、押している間に他のキーを押さなかった場合にのみ起動することです。事例:

LControl & F1::return  ; 少なくとも1回は"&"の前に使うことで、left-controlを接頭辞とします。
LControl::MsgBox "You released LControl without having used it to modify any other key."

注:キーボートとマウス・ジョイスティックのボタンのリストは、キーリストをご覧ください。

複数のホットキーを縦に重ねて、同じ動作をさせることができます。事例:

^Numpad0::
^Numpad1::
{
    MsgBox "Pressing either Ctrl+Numpad0 or Ctrl+Numpad1 will display this."
}

キーやキーの組み合わせは、何もしないことでシステム全体の機能を無効にすることができます。次の例では、右側のWinを無効にしています:

RWin::return

文脈依存のホットキー

#HotIfディレクティブを使用すると、特定の条件によってホットキーに異なる動作をさせることができます(または全くさせないこともできます)。事例:

#HotIf WinActive("ahk_class Notepad")
^a::MsgBox "You pressed Ctrl-A while Notepad is active. Pressing Ctrl-A in any other window will pass the Ctrl-A keystroke to that window."
#c::MsgBox "You pressed Win-C while Notepad is active."

#HotIf
#c::MsgBox "You pressed Win-C while any window except Notepad is active."

#HotIf MouseIsOver("ahk_class Shell_TrayWnd") ; MouseIsOver については、#HotIf の例 1を参照してください。
WheelUp::Send "{Volume_Up}"     ; タスクバー上のホイール:音量の増加/減少。
WheelDown::Send "{Volume_Down}" ;

カスタムコンビネーション

通常、ショートカットキーの組み合わせは、任意のプレフィックス/モディファイアキー(Ctrl、Alt、Shift、LWin/RWin)と1つのサフィックスキーで構成されます。標準装備の修飾キーは、このような使い方を想定して設計されているため、通常は押してもすぐには効果がありません。

2つのキーの間に" & "を使用することで、2つのキーのカスタムコンビネーションを定義することができます。このキーにはマウスボタンを含みますが、ジョイスティックのボタンは含みません。カスタムコンビネーションは、通常使用されないプレフィックスキーでの使用を想定しているため、以下のような特殊な動作をします:

注:標準的な修飾キーとの組み合わせの場合、通常は標準的な構文を使用する方がよい。例えば、LShift & s::ではなく、<+s:: を使用します。

以下の例では、Numpad0を押した後、2番目のキーを押してホットキーを起動します:

Numpad0 & Numpad1::MsgBox "You pressed Numpad1 while holding down Numpad0."
Numpad0 & Numpad2::Run "Notepad"

プレフィックスキーが本来の機能を失う。上記の例では、Numpad0がプレフィックスキーになりますが、Numpad0が単独で押された場合、本来の機能を失うことになります。これを避けるために、スクリプトでNumpad0に次のような新しいアクションを実行させるように設定することができる:

Numpad0::WinMaximize "A"   ; アクティブ/フォアグラウンドウィンドウを最大化します。
Numpad0::Send "{Numpad0}"  ; Numpad0 のリリースでNumpad0 のキーストロークを生成させる。以下のコメント参照。

リリース時に発射:上記のカスタムコンビネーションホットキーが存在する場合、Numpad0を離すと指示されたアクションが実行されますが、Numpad0を押している間に他のキーを押していない場合に限られます。この動作は、いずれかのホットキーにチルダ接頭辞を付けることで回避できます。

モディファイア:通常のホットキーとは異なり、カスタムの組み合わせは、デフォルトでワイルドカード(*)モディファイアを持つように動作します。例えば、1 & 2::は、12を押したときにCtrlまたはAltが押されていても起動しますが、^1::Ctrl+1で起動し、Ctrl+Alt+1では起動しないでしょう。

3つ以上のキーの組み合わせはサポートされていません。キーボードのハードウェアがサポートする組み合わせは、通常#HotIfGetKeyStateを使用して検出することができますが、結果は一貫していない場合があります。事例:

; AppsKey と Alt を任意の順番で押して、スラッシュ(/)を押します。
#HotIf GetKeyState("AppsKey", "P")
Alt & /::MsgBox "Hotkey activated."

; キーが入れ替わっている場合は、Altを先に押す必要があります(一度に1つずつ使用します):
#HotIf GetKeyState("Alt", "P")
AppsKey & /::MsgBox "Hotkey activated."

; [ & ] & \::
#HotIf GetKeyState("[") && GetKeyState("]")
\::MsgBox

キーボードフック:キーボードキーを使ったカスタムコンビネーションは常にキーボードフックを使用し、接尾辞としてプリフィックスキーを使用するホットキーも同様です。例えば、a & b::では、^a::は常にフックを使用するようになります。

その他の機能

NumLock、CapsLock、ScrollLock:これらのキーは、強制的に「AlwaysOn」または「AlwaysOff」にすることができます。事例:SetNumLockState "AlwaysOn"

エクスプローラーのホットキーのオーバーライド: Win+E(#e)、Win+R(#r)などのWindowsの内蔵ホットキーは、スクリプト内のアクションに割り当てるだけで、個別にオーバーライドすることができます。詳しくはオーバーライドページをご覧ください。

Alt-Tabの代替:ホットキーは、Alt-Tabの代替手段を提供することができます。例えば、以下の2つのホットキーで、右手でalt-tabすることができます:

RControl & RShift::AltTab  ; 右コンを押しながら、右シフトを繰り返し押して前進します。
RControl & Enter::ShiftAltTab  ; 右クリックを離すことなく、Enterキーを押すと方向が反転します。

詳しくは、「Alt-Tab」をご覧ください。

マウスホイールホットキー

マウスのホイールを回転させることで発動するホットキーは、WheelDownとWheelUpのキー名でサポートされています。ここでは、マウスホイールのホットキーの例を紹介します:

MButton & WheelDown::MsgBox "You turned the mouse wheel down while holding down the middle button."
^!WheelUp::MsgBox "You rotated the wheel up while holding down Control+Alt."

マウスがサポートしている場合、WheelLeftとWheelRightのキー名で水平スクロールを検出することができます。マウスによっては、ホイールが1つで、上下スクロールや左右に傾けることができるものもあります。一般的には、ホイールを片側に寄せた状態でWheelLeftやWheelRightの信号を繰り返し送信し、連続スクロールを模擬します。これにより、通常、ホットキーが繰り返し実行されることになります。

組込変数A_EventInfoには、ホイールが回転した量(通常120)が格納されます。ただし、以下の場合はA_EventInfoが120より大きくなったり小さくなったりすることがある:

マウスホイールを使った便利なホットキーの中には、ウィンドウのテキストをスクロールさせる別のモードがあります。例えば、以下のホットキーのペアは、左Ctrlを押しながらホイールを回すと、垂直方向ではなく水平方向にスクロールします:

~LControl & WheelUp::  ; 左にスクロールします。
{
    Loop 2  ; <-- この値を大きくするとスクロールが速くなります。
        SendMessage 0x0114, 0, 0, ControlGetFocus("A")  ; 0x0114 は WM_HSCROLL、その次の 0 は SB_LINELEFT です。
}

~LControl & WheelDown::  ; 右にスクロールします。
{
    Loop 2  ; <-- この値を大きくするとスクロールが速くなります。
        SendMessage 0x0114, 1, 0, ControlGetFocus("A")  ; 0x0114 は WM_HSCROLL、その次の 1 は SB_LINERIGHT です。
}

最後に、マウスホイールのホットキーはダウンイベントのみを生成するため(アップイベントは生成しない)、キーアップホットキーとして使用することはできません。

ホットキーのヒントと備考

それぞれのテンキーは、NumLockの状態に応じて2つの異なるホットキーサブルーチンを起動させることができます。また、テンキーは状態に関係なく同じサブルーチンを起動するようにすることもできます。事例:

NumpadEnd::
Numpad1::
{
    MsgBox "This hotkey is launched regardless of whether NumLock is on."
}

チルダ(~)が一度でも接頭辞キーと一緒に使われると、その接頭辞キーの動作がすべての組み合わせで変更されます。例えば、次の2つのホットキーでは、定義のうち1つだけがチルダを含んでいても、アクティブウィンドウはすべての右クリックを受け付けます:

~RButton & LButton::MsgBox "You pressed the left mouse button while holding down the right."
RButton & WheelUp::MsgBox "You turned the mouse wheel up while holding down the right button."

サスペンド機能は、一時的に免除したもの以外のホットキーを無効にすることができます。より選択性を高めたい場合は、#HotIfをご利用ください。

Hotkey機能により、スクリプトの実行中に動的にホットキーを作成することができます。また、ホットキー機能は、スクリプトの既存のホットキーを個別に変更、無効化、有効化することができます。

ジョイスティックのホットキーは、現在、^(Ctrl)や#(Win)などの修飾子の接頭辞をサポートしていません。しかし、次の例に示すように、GetKeyStateを使用して、この効果を模倣することができます:

Joy2::
{
    if not GetKeyState("Control")  ; 左右のコントロールキーが押されていない。
        return  ; すなわち、何もしない。
    MsgBox "You pressed the first controller's second button while holding down the Control key."
}

ホットキーは、それ自身の修飾キーが解除されるまで待ってから続行する必要がある場合があります。次のような例を考えてみましょう:

^!s::Send "{Delete}"

Ctrl+Alt+Sを押すと、Ctrl+Alt+Delを押したかのように動作します(このホットキーをシステムが積極的に検知するため)。これを回避するには、KeyWaitを使用して、キーが解放されるのを待ちます:

^!s::
{
    KeyWait "Control"
    KeyWait "Alt"
    Send "{Delete}"
}

#z::のようなホットキーで「Invalid Hotkey」のようなエラーが発生する場合、システムのキーボードレイアウト/言語に指定された文字(この場合は"Z")がない可能性があります。キーボードレイアウトに存在することが分かっている別の文字を使用してみてください。

ホットキーの機能は、その関数に名前が付けられている場合にのみ、スクリプトから明示的に呼び出すことができます。名前付き機能ホットキーを参照してください。

ホットキーの一般的な使い方として、一連のキー操作やマウスクリックなど、繰り返しの動作を開始したり停止したりすることが挙げられます。この例については、このFAQのトピックを参照してください。

最後に、各スクリプトは準マルチスレッドであり、前のホットキーサブルーチンがまだ実行中であっても、新しいホットキーを起動することが可能です。例えば、現在のホットキーでメッセージボックスを表示している最中でも、新しいホットキーを起動させることができます。

Alt-Tabのホットキー

Alt-Tabホットキーは、タスクの切り替え(ウィンドウのアクティブ化)のためのメニューを呼び出すために使用されるシステムのAlt-Tabホットキーに、新しいキーの組み合わせを簡単にマッピングすることができます。

Alt-Tabの各ホットキーは、単一のキーまたは2つのキーの組み合わせでなければならず、通常はアンパサンドシンボル(&)で実現します。次の例では、右のAltを押しながら、JまたはKを押して、alt-tabメニューを操作することになります:

RAlt & j::AltTab
RAlt & k::ShiftAltTab

AltTabShiftAltTabは、ホットキーと同じ行で使用した場合のみ認識される特殊コマンドのひとつです。以下、全リストです:

AltTab:Alt-tabメニューが表示されているときに、次のウィンドウを選択します。そうでないときは、Alt-tabメニューを表示します。ただし、ホットキーが2つのキーの組み合わせの場合のみで、それ以外の場合は何もしません。

ShiftAltTab:上と同じですが、前のウィンドウを選択します。

AltTabMenu:Alt-tabメニューを表示したり非表示にしたりします。

AltTabAndMenu:Alt-tabメニューが表示されているときに、次のウィンドウを選択します。それ以外の場合は、メニューを表示します。

AltTabMenuDismiss:Alt-tabメニューを閉じます。

上記を説明すると、マウスホイールをまるごとAlt-tabの代用品にすることができる。以下のホットキーが有効な場合、中央のボタンをクリックするとメニューが表示され、ホイールを回すとメニューの中を移動します:

MButton::AltTabMenu
WheelDown::AltTab
WheelUp::ShiftAltTab

選択したウィンドウをアクティブにせずにAlt-Tabメニューをキャンセルするには、Escを押すか送信してください。次の例では、左Ctrlを押しながらCapsLockを押すと、メニューが表示され、その中で先に進むことができます。そして、左Ctrlを離すと選択したウィンドウがアクティブになり、マウスホイールを押すとキャンセルされます。この例を実行する前に、AltTabWindowウィンドウグループを以下のように定義してください。

LCtrl & CapsLock::AltTab
#HotIf WinExist("ahk_group AltTabWindow")  ; alt-tab メニューが画面上に存在することを示します。
*MButton::Send "{Blind}{Escape}"  ; Altが押されていても押されていなくても発射されるように、*の接頭辞を付けています。
#HotIf

スクリプトで{Alt Down}を送信した場合(Alt-Tabメニューを呼び出すなど)、次の例のように{Alt Up}も送信する必要がある場合があります。

総論

現在、Alt-tabの特殊な動作は、上記の例のようにホットキーに直接割り当てる必要があります(つまり、機能のように使用することはできません)。彼らは#HotIfの影響を受けません。

alt-tabアクションは、upキーワードが使用されているかどうかにかかわらず、キーダウンおよび/またはキーアップで有効になる可能性があり、同じキー上の他のアクションと組み合わせることはできません。例えば、F1::AltTabMenuF1 up::OtherAction()の両方を使用することはサポートされていません。

また、alt-tabのカスタムアクションをホットキーで作成することも可能です。alt-tabメニューのアイデンティティはOSのバージョンによって異なるため、以下のようにウィンドウグループを使用すると便利な場合があります。ahk_group AltTabWindowを使用する上下の例では、スクリプト起動時にこのウィンドウグループが定義されていることが期待されます。あるいは、ahk_group AltTabWindowは、お使いのシステムに適したahk_classに置き換えることができます。

GroupAdd "AltTabWindow", "ahk_class MultitaskingViewFrame"  ; Windows 10
GroupAdd "AltTabWindow", "ahk_class TaskSwitcherWnd"  ; Windows Vista、7、8.1
GroupAdd "AltTabWindow", "ahk_class #32771"  ; オールド、またはクラシックなalt-tabを有効にした場合。

次の例では、F1キーを押してメニューを表示し、その中で先に進むことになります。そして、選択したウィンドウをアクティブにするにはF2キーを、キャンセルするにはEscキーを押します:

*F1::Send "{Alt down}{tab}" ; この場合、アスタリスクが必要です。
!F2::Send "{Alt up}"  ; Altキーを離すと、選択したウィンドウがアクティブになります。
#HotIf WinExist("ahk_group AltTabWindow")
~*Esc::Send "{Alt up}"  ; メニューがキャンセルされたときは、自動的にAltキーを離します。
;*Esc::Send "{Esc}{Alt up}"  ; チルダ(~)がなければ、エスケープを送信する必要があります。
#HotIf

名前付き機能ホットキー

ホットキーの機能を、ホットキー自体をトリガーすることなく呼び出す必要がある場合、この例のように、ホットキーのダブルコロンの直後に定義するだけで、1つまたは複数のホットキーに名前付き機能を割り当てることができます:

; Ctrl+Shift+Oで、エクスプローラーに含まれるフォルダを開くことができます。
; Ctrl+Shift+E で現在のファイルが選択されているフォルダを開きます。
; SciTEとNotepad++をサポートします。
^+o::
^+e::
    editor_open_folder(hk)
    {
        path := WinGetTitle("A")
        if RegExMatch(path, "\*?\K(.*)\\[^\\]+(?= [-*] )", &path)
            if (FileExist(path[0]) && hk = "^+e")
                Run Format('explorer.exe /select,"{1}"', path[0])
            else
                Run Format('explorer.exe "{1}"', path[1])
    }

関数editor_open_folderがスクリプトから明示的に呼び出される場合、最初のパラメータ(hk)には値を渡さなければなりません。

ホットストリングは、このように定義することもできます。複数のホットキーやホットストリングを重ねて、同じ機能を呼び出すことができます。

ホットキーと機能名の間には、空白またはコメントのみでなければなりません。

また、関数に名前を付けることで、上記のコードのように、関数名がホットキーを説明するような、ホットキーの自己文書化を促進します。

また、ホットキー機能を使って、機能や機能オブジェクトをホットキーに割り当てることができます。