rcmdnk's blog

20130723_AutoHotKey_200_200

AutoHotkeyの基本的な使い方についてと、 自分が詰まったところについてのメモ。

変数、関数、ウィンドウ毎の設定などについて。

Sponsored Links

変数

yamyやMacのKeyRemap4MacBook 等と大きく違うのが変数を使えることだと思います。 変数に文字列を収納することで、1つの変数で複数のモードを 作れるので管理が簡単になります。


この変数の初期設定について少し注意が必要で、 Auto-execute sectionと呼ばれる領域でしか 初期値設定できません。 この領域は設定ファイルの先頭から始まり、 Returnやキー設定などが出るまでの領域になります 1


変数には型はなく、数式などでは数値である場合はその時に 数値として解釈されます。 前回書いたように、 変数でも、変数自体の大文字小文字は区別されません。 (aという変数を作った場合にAでも参照できます。)

値の代入は:==で行い、:=の場合には右辺が評価されてから 代入が行われます。

文字列を入れる時は

a := "abc" ;1
a := abc   ;2
a = "abc"  ;3
a = abc    ;4

とするとそれぞれ

  1. abc
  2. 変数abcに入っていた値
  3. "abc" ("も含む)
  4. abc

がそれぞれ代入されることになるので1と4が同じ結果になります。

数値の場合は

a := 123
a = 123

の両方共一緒です。=を使って変数の値を渡すには

a= %abc%

の様に、変数を%で囲みます。 これは他でも同様で、変数の中身を参照するには(MsgBoxで表示させたりするには) %で囲みます。

関数

MyFuncion(a="abc",b) {
  Send,a
  MsgBox,b
  Return
}

関数はこの様な形で書きます。 引数にはデフォルト値を与える事もできます。 この関数を呼ぶには

a::MyFuncion("def","ghi")

の様な感じで。


関数内で変数を使いたい場合、関数外の値を参照したり 変更を関数外にも反映したい場合は

global a = "abc"

と各項目でglobalを付けて取り扱うか関数の最初に

c="def"
MyFuncion(a="abc",b) {
  global
  c:=a
  ...

の様にglobalを書いておく必要があります。


この他にGotoGosubと言うコマンドが有ります。

  • Gotoは、指定したラベルの位置に飛んで処理を続ける
  • Gosubは、指定したラベルの位置に飛んで処理を続け、Returnが出たところで元の位置に戻ってくる

という処理を行います。

a::
  Goto,label1
  MsgBox,a
  Return
b::
  Gosub,label1
  MsgBox,b
  Return
label1:
  MsgBox,label1
  Return

とすると、aを押したときはlabel1のメッセージボックスが出るだけで、 bを押すとlabel1と表示された後、bも表示されます。

従って、Gosubの方は、引数なし関数的な使い方も出来ます。

Windowごとの設定

Window毎にキー設定を変えるには

#IfWInActive ahk_class Notepad
...

の様な形でWinActiveを使います。 これは

#If WInActive("ahk_class Notepad")
...

と書くことも出来ます。

#Ifを使うことでそれ以降、その条件下でのみ設定を有効にでき、 WinActiveはその後に続くWindowが最前面の時、となります。

指定を解除するには

#IfWInActive

の様に引数なしで指定するとそれ以降条件無し、に戻ります。

指定出来るのはタイトルか上にあるようなクラス名でこれらは AutoHotkeyのタスクトレイアイコンを右クリックした際に選べる Window spyを使って調べます。

一番上のWindow Title & Class

  • Title: 無題 - メモ帳
  • Class: ahk_class Notepad

が得られます。

複数のWindowを指定したい場合はGroupを作る事が出来、

GroupAdd Note, ahk_class Notepad
GroupAdd Note, ahk_class WordPadClass

の様にGroupAddを使いNoteと言う名前のGroupを作り、

#IfWInActive ahk_group Note
...

ahk_groupで名前を指定します。


FirefoxとThunderbirdのClassが同じ ahk_class MozillaWindowClassです。

FirefoxではVimperatorでVimっぽくしていて、 Thunderbirdではメールを書く時にAutoHotkeyでVimっぽくしたいので 割と都合が悪いです。

そこで、タイトルの方を使います。 Thunderbirdのメール作成Windowは

作成:(件名なし)

の様なタイトル名です。もちろん、件名なしは件名を書いてない状態で、 件名を書き込むと変わります。

ただ、AutoHotkeyでは、一部が一致すれば解釈する様なので、

#IfWinactive 作成:

の様な形で書いておけばThunderbirdの作成Windowで有効にする設定が出来ます。 おそらく他にも作成:と言ったタイトル名を持つ物はあるので注意が必要です。 (今のところ他に見つけてませんが。)


Window以外にも、変数を使った条件なども使え

#If WInActive("ahk_group Notepad") and (a="enable")

の様にすれば、メモ帳上で、かつ、aの変数にenableが入ってる場合に 有効になります 2

分岐

各キー設定や関数の中でもifが使えます。

a::
  if WInActive("ahk_group Notepad") {
    Send,b
  }else if (a="enable")
    Send,c
  }else{
    Send,d
  }
  Return

と言うようにelse if等も使えます。 (この場合にはIfWinactive)


この場合にもIfWinactiveが使えますが、 その場合は、{が必ず次の行にくる必要があります 3

a::
  IfWInActive ahk_group Notepad
  {
     ...

If WInActive("...の場合は同じ行でも次でもOK。


Loop

繰り返しは

Loop 10 {
  MsgBox,  %A_Index%
  If (A_Index=5){
    break
  }
  Sleep 1000
}

という様にLoopコマンドではじめ、引数として回数を指定します。

Loopを抜けるためにはbreak、途中でループ処理を中断して戻ってLoopを再開するにはcontinueを使います。

数字が省略された場合は、breakで止めるかreturnなどで その設定/関数自体を終わらせるまで永遠とLoopします。

上の例で使われているA_IndexはLoopの回数で 1から増えていきます。

上の例では、1から5までのメッセージを表示します。 最後にあるSleepは引数がミリ秒で、この場合ここで1秒待つことになります。

長押しで違うキー設定に

KeyWaitコマンドを使うことで長押しした時に違う命令を送ることが出来ます。

a::
  KeyWait, a, T0.5
  if (ErrorLevel){
    Send,b
    Return
  }
  Send,c
  Return

KeyWaitに続き、押されているキー、待つ時間(Tに続き単位で)を書き、 結果がErrorLevelに収納されます。 指定時間内に

上の例ではaを押して直ぐに話せばcを、 0.5秒以上押していればbを送ります 4

他のファイルを読み込む

他のファイルの 設定ファイルの中で他のファイルを読み込みたい時はincludeを使い

#Include  %A_ScriptDir%\other.ahk

とします。 %A_ScriptDir%は、読み込もうとしているファイルの位置です。


この位置に展開される形になるので、 Auto-execute section について注意して設定する必要があります。


Happy Hacking Keyboard用設定

Happy Happy Keyboard にあるダイヤモンドキー(スペース両隣のキー)の設定:

; For HHK
vkFFsc079::RAlt
vkFFsc07b::LAlt

など。上の設定では

  • Alt
  • Alt

その他参考ページなど

Sponsored Links
Sponsored Links

« AutoHotkeyの使い方1 Vim以外でVimする: Windows+AutoHotkey編 »