スクリプト例

スクリプトの自動リロード

実行中のスクリプトを、編集後の新しいスクリプトに簡単に更新します。これはスクリプトの作成時に有用です。

次の例では、エディタでスクリプトのファイルを上書き保存したときに、自動的にスクリプトがリロードされます。

#IfWinActive, ahk_class Notepad

~^s::
    ScriptName := "AutoHotkey.ahk"
    IfWinActive, %ScriptName%
    {
        Reload
    }
return

この例では、

  • エディタは、メモ帳 (ahk_class Notepad)
  • エディタの上書き保存のショートカットは、Ctrl + s (^s)
  • スクリプトのファイル名は、"AutoHotkey.ahk"

であると仮定しているため、実際にはこれらをお使いの環境に合わせる必要があります。

ショートカット無効化

予期せず機能が実行されるような、迷惑なショートカットを無効化します。そのためにはスクリプトとしてreturnだけを記述します。たとえばF1を無効化するには、

F1:: return

とします。しかしただ無効にしただけでは、意図してショートカットを使用したときに何が起きたのかわからなくなることがあります。そのような状況を考慮すると、Beep音を鳴らすようにしておくと、無効化されていることが理解しやすくなります。

F1:: SoundBeep

複数のキーを無効にするには、

F1::
^a::
    SoundBeep
return

のようにします。

キー入力の修正

キー入力時に、そのキー入力をブロックせずに処理をするには、ホットキーの修飾記号を使用して、

~a::
~b::
    ; 何らかの処理
return

のようにします。しかしこの方法では、処理する前にキーの入力が行われてしまいます。それでは都合が悪いときは、

a::
b::
    hotKey := A_ThisHotkey

    ; 何らかの処理

    Send, %hotKey%
return

のように、キー入力をブロックした状態で処理をした後に、キー入力を発生させます。

マウスホイールによる水平スクロール

次のようにすることでShift+ホイールで水平スクロールさせられます。

+WheelDown::WheelRight
+WheelUp::WheelLeft

スクロール量を調整するには、Sendで送信する数を指定します。

+WheelDown::Send, {WheelRight 4}
+WheelUp::Send, {WheelLeft 4}

アプリケーションが水平スクロールに対応していない場合は、SendMessageでメッセージを送信します。

WM_HSCROLL := 0x114
SB_LINELEFT := 0
SB_LINERIGHT := 1

+WheelUp::
    ControlGetFocus, focusedControl, A
    SendMessage, WM_HSCROLL, SB_LINELEFT, 0, %focusedControl%, A
Return

+WheelDown::
    ControlGetFocus, focusedControl, A
    SendMessage, WM_HSCROLL, SB_LINERIGHT, 0, %focusedControl%, A
Return
0x114 - scroll wheel - Horizontal scrolling shortcut in Windows - Super User WM_HSCROLL メッセージ (Winuser.h) - Win32 apps | Microsoft Learn

WM_HSCROLLメッセージを用いるときのスクロール量は、0 (SB_LINELEFT) と1 (SB_LINERIGHT) ではスクロール矢印をクロックした量となりますが、2 (SB_PAGELEFT) と 3 (SB_PAGERIGHT) ではスクロールバー シャフト (scroll bar shaft) をクリックした量となります。 スクロール バーについて - Win32 apps | Microsoft Learn WinUser.h

フォーカスのあるウィンドウではなくマウスポインタの位置にあるウィンドウを対象とするには、ControlGetFocusの代わりにMouseGetPosを用います。

MouseGetPos, , , , focusedControl

ダイアログの表示時にマウスポインタの位置へ移動

ダイアログがマウスポインタを中心とした位置に表示されるようにします。次の例では、Ctrl + Fで検索ダイアログが表示される場合を想定しています。

~^f::
    WinWait, 検索 ahk_class #32770, , 0.5
    if( ErrorLevel == 0 )
    {
        CoordMode, Mouse, Screen
        MouseGetPos, x, y

        WinGetPos, , , width, height, ahk_class #32770
        WinMove, 検索 ahk_class #32770, , x - width / 2, y - height / 2
    }
return

ダイアログを自動で閉じる

特定のスクリプトの実行時に表示されるダイアログならば、そのスクリプト内でIfWinExistによりウィンドウを検出して、それを閉じます。たとえばESCで閉じられるならば、次のようにします。

; ダイアログを表示させるような処理

IfWinExist, ahk_class #32770
{
    ControlSend, , {ESC}, ahk_class #32770
}

スクリプトの実行と関係なく表示されるダイアログならば、スクリプトをSetTimerで定期実行し、そこでウィンドウの存在を確認して閉じるようにします。

SetTimer, Task, 500

Task:
    IfWinExist, SAMPLE
    {
        ControlClick, X100 Y50, SAMPLE
    }
return

この例では、SAMPLEというタイトルを持つウィンドウが表示されたら、そのウィンドウの座標 (100,50) の位置が自動でクリックされます。

アクティブウィンドウのテキストをファイルに保存

アクティブなウィンドウのテキストを、指定ファイルに追記保存します。

SaveActiveWindowText( filepath )
{
    WinGetText, text, A
    FileAppend, %text%, %filePath%
}

選択されているテキストを指定パターンで置換

選択されているテキストをクリップボードにコピーし、それを置換して貼り付けます。

Replace( pattern, replacement )
{
    clipboard =
    Send, ^c

    ClipWait, 0.1
    if( ErrorLevel == 0 && StrLen( clipboard ) != 0 )
    {
        str := clipboard
        str := RegExReplace( str, %pattern%, %replacement% )

        clipboard := str
        Send, ^v
    }
}

参考