AutoHotKeyのスクリプト例

AutoHotKeyで使った構文やスクリプトの例を書いておく。

スクリプト作成時の注意

基本的なことは、公式ドキュメントのチュートリアルを読む。たぶん機械翻訳とかでも十分わかる:

Beginner Tutorial | AutoHotkey v1
Learn how to download and install AutoHotkey, to create a script, to use hotkeys and hotstrings, to send keystrokes, to ...

機械翻訳はdeeplがおすすめ:

DeepL Translate: The world's most accurate translator
Translate texts & full document files instantly. Accurate translations for individuals and Teams. Millions translate wit...

その他の注意事項も記しておく:

  • AutoHotKeyのバージョンは1.1以降
  • ファイルのエンコードはUTF-8(BOMつき)にしておく。(BOMなしでも動いてたけど念のため)

スクリプト例

先にスクリプトを載せて、そのあとに解説を入れておく。バグチェックは面倒だがMsgBoxを使って変数の確認などしている。

特定ソフトがアクティブの時だけ、指定フォルダからランダムにテキストファイルをそのソフトで開く

Ctrl+zで動作を行うとする。特定ソフトがアクティブでないなら、普通通りの振る舞い(アンドゥなど)をする。

$^z::
    ; <Some_App>.exeがアクティブウィンドウ時のみ
    if WinActive("ahk_exe <Some_App>.exe")
    {
        ;ファイルパス取得
        basedir := "C:\some\folder\"
        file_array := []
        globStr := Format("{:s}*.txt", basedir)
        Loop, Files, %globStr%
        {
            filepath := StrReplace(A_LoopFileLongPath, A_Space, "` ")
            file_array.Push(filepath)
        }
        Random, rIndex, 1, file_array.Length()
        value := file_array[rIndex]
        Run C:\some\folder2\<Some_App>.exe "%value%"
    }
    else
    {
        ; 該当しないときはいつものふるまい
        send, ^z
    }
    return

ifWinActiveで特定のアプリの起動中などをチェックできる。起動中でないときは、デフォルトの振る舞いをさせる。デフォルトの動作をさせるには、$^zのようにホットキーで$をつけないと、sendでループに陥ってしまうので注意する。

Pythonでいうstrの変数は、aVariable := "this is a variable"で作成できる。

AutoHotKeyArrayもサポートしていて、file_array := []で空の配列が作成できる。配列は添え字が1から始まる。詳細は次のリンクを参照のこと:

Objects - Definition & Usage | AutoHotkey v1
Learn details about basic usage of objects, extended usage of objects, custom objects, default base object and implement...

文字列の連結は、.でもできるが、今回は、Format(formatString, values...)で行なった。文字列を埋め込むなら、{:s}を指定しておけばいい。詳細:

Format() - Syntax & Usage | AutoHotkey v1
The Format function formats a variable number of input values according to a format string.

Loop, Files, <filePattern> { expressions }globのようなファイルの探索ができる。ここではファイルパターンとして、C:\some\folder\*.txtを指定して、フォルダC:\some\folder\の中にあるテキストファイルを探す。 Loopブロックの中では、各ファイルについての処理を行うことができる。ファイルの情報は、A_LoopFileLongPathなどを参照できる。他の情報の取得については次を参照のこと:

Loop (files & folders) - Syntax & Usage | AutoHotkey v1
The Loop Files statement retrieves the specified files or folders, one at a time.

ループの中では、あとでランダムに選ぶために、配列へファイルパスを追加(Push)している。ここでの注意点として、ファイルパスにスペースが混じっていると追加を行えず、エラーを起こしてしまう。そのため、StrReplaceを使ってスペースをバッククォートでエスケープしている。(ちなみに全角スペースは試していないが半角スペースが問題だと思うので普通に動くはず…) StrReplace("some string", A_Space, "` ")を使うと、some` stringとなり、AutoHotKeyがエスケープしてくれるようになる。

ループを抜けたら、Randomを使ってランダムなインデックスrIndexを生成する。 Random, <var1>, min, maxを使って、変数var1[min, max]の範囲(min,max含む)でランダムな値を代入できる。

生成したランダムなインデックスを使って、用意したファイルパスの配列からパスを1つ取り出す。 そして、Runでプログラムに、パスを引数として渡す。

最後のRunでは、多重起動を防ぐようにはしていないので、ソフトが多重起動できるようになっていれば、新しいウィンドウが開くと思う。今回使ったソフトは多重起動しないので、そのまま開いているウィンドウでパスを扱うことができた。

ホットキーでしたいことが終わったら、returnでホットキーを抜ける。

説明おわり。

キーひとつでスクリーンショットを保存する

2022/2追記

Win+Shift+Sでスクショが撮れることは知っていたがその後手動で保存先を指定して保存しないといけないのが面倒なため、AutoHotKeyで保存までできるようにする。

Win+Shift+Sでなくとも、Win+PrintScreenピクチャフォルダにスクリーンショットが保存される。また、これはサブディスプレイなどを連結して全体で1枚の画像にして保存するもの。

アクティブなウィンドウだけを保存するショートカットキーもある。Win+Alt+PrintScreenでできる。これは先のものと違いピクチャフォルダに保存はされずに、ビデオフォルダに保存される。スクリーンショットというよりは、キャプチャのようでキャプチャというフォルダ内に保存される。WindowsのXbox Game Barの機能のようにも見える。XBox Game Barを無効化すると機能が利用できなかった。

;...

; 右ウィンドウズキーでアクティブウィンドウをスクショして保存(ビデオフォルダ)XboxGameBarを利用しているようでこれがオフだとスクショできない。
RWin::send #!{PrintScreen}

; 右Altと右ウィンドウズキーで画面全体をスクショして保存(ピクチャフォルダ)
>!RWin::send #{PrintScreen}

全体的に言えることだが、欠点としては、autohotkeyが効かないソフトがアクティブだと動作しない。残念。。 もう少し何とかなるといいのだが。

おわり

今後使ったものは追加していきたい。

以上です。

コメント

タイトルとURLをコピーしました