v1.1からv2.0への変更

目次

言語

レガシーシンタックスの廃止

リテラルの割り当てが廃止されました:var = value

従来のIf文がすべて廃止され、if式のみを残し、括弧を必要としません(ただし、あらゆる式と同様に括弧を使用できる)ようにしました。

"command syntax"の廃止。コマンドは存在せず、ただ 関数呼び出し文があります。これは、括弧のない単なる関数やメソッドの呼び出しです。これは、以下を意味します:

v1コマンドから関数への変換は概ね以下の通りです(ただし、一部の関数は後述するように変更されています):

以下に記す場合を除き、すべての制御フロー文は式も受け付けます。

パラメータを取るすべての制御フロー文(現在、2語のLoop文を除く)は、パラメータリストを括弧で囲み、名前と括弧の間にスペースを入れずにサポートします。例えば、return(var)。しかし、これらは関数ではないので、例えば、x := return(y)は無効です。IfWhileは、すでにサポートしています。

Loop(Loop Countを除く)の後に、"引用"したり変数で囲むことのできない副キーワード(Files, Parse, Read or Reg)が続くようになりました。現在、キーワードの後にカンマを付けることができますが、これはパラメータではないので必須ではありません。OTB is supported by all modes.

Goto, Break and Continue require an unquoted label name, similar to v1 (goto label jumps to label:). ラベルに動的にジャンプするには、名前のすぐ後に括弧を使用します:goto(expression). ただし、これは関数ではないので、式の途中で使用することはできません。Parentheses can be used with Break or Continue, but in that case the parameter must be a single literal number or quoted string.

Gosubが削除され、SetTimerHotkeyなどの機能でラベルが使用できなくなりました。

ホットキーとホットストリングラベル

ホットキーや自動置換でないホットストリングは、ラベルではなくなり、代わりに(自動的に)機能を定義するようになりました。複数行のホットキーの場合、returnで終了させるのではなく、中括弧を使ってホットキーの本体を囲みます(終了中括弧はこれを意味します)。ホットキーを明示的に呼び出すには、::{の間にfuncName(ThisHotkey)を指定します - これは v1.1.20+ でも行えますが、現在はパラメータがあります。関数定義が明示されていない場合、パラメータはThisHotkeyと命名されます。

注:ホットキー関数はデフォルトでassume-localであるため、宣言なしでグローバル変数に代入することはできません。

名称

関数名と変数名が共有名前空間に配置されるようになりました。

氏名は数字で始まることはできず、従来は認められていた以下の文字を含むことはできません:@ # $. 使用できる文字は、英字、数字、アンダースコア、非ASCII文字のみです。

予約語:宣言キーワードや制御フロー文の名前は、変数名、関数名、クラス名として使用することはできません。これは、local, global, static, if, else, loop, for, while, until, break, continue, goto, return, switch, case, try, catch, finally および throw を含んでいます。これは主にif (ex) breakのようなエラーを検出するためです。

予約語: as,and,contains,false,in,is,IsSet,not,or,super,true,unset. これらの単語は、将来の使用やその他の特定の目的のために予約されており、曖昧でない場合でも、変数名や関数名として許可されていません。これは主に一貫性を保つためです:v1では、and := 1は、単独で行えたが、(and := 1)は動作しません。

上記の単語は、プロパティ名やウィンドウグループ名として許可されています。一般的に使用されるプロパティ名の前には、演算子として解釈されることを防ぐために、.が付いています。一方、キーワードは式中の変数名や関数名として解釈されることはありません。例えば、not(x)は、not (x)または(not x)と同じ意味です。

多くのクラスが事前に定義されており、ユーザー定義クラスと同じように、グローバル変数名を効果的に予約することができます。(ただし、後述するスコープの変更により、このことから生じる問題はほとんど緩和されます)。クラスの一覧は、「組み込みクラス」を参照してください。

スコープ

スーパーグローバル変数が廃止されました(組み込み変数を除く、再宣言やシャドウができないので同じではありません)。

想定ローカル関数内で、与えられた名前が宣言や非動的代入、参照(&)演算子のターゲットとして使用されていない場合、既存のグローバル変数に解決することがあります。

換言:

強制ローカルモードは削除されました。

変数

ローカル静的変数は、自動実行セクションが始まる前に線形順序で実行されるのではなく、実行が到達したときに初期化されます。各イニシャライザーは、2回目に到達したときには何の効果もありません。複数の宣言を行うことができ、同じ変数に対して異なるタイミングで実行することができます。メリットは複数あります:

注: static init := somefunction()は、somefunctionの自動実行には使えなくなりました。しかし、ラベルとリターンに基づくサブルーチンを完全に回避できるようになったため、自動実行セクションはスクリプト全体に及ぶことができるようになりました。

変数をlocalで宣言しても、その関数がassume-globalにならなくなりました。

ダブルデフがロード時に解決される変数との整合性が高くなり、新しい変数を作成することができなくなりました。これにより、いくつかの矛盾や共通の混乱点を回避することができます。

ダブルデフが何らかの理由で失敗した場合、エラーが発生するようになりました。以前は、無効な名前を持つケースは黙って空文字列を生成し、その他のケースは空の変数を生成して返していました。

引用リテラル文字列は、"double"または'single'の引用符で書くことができますが、同じ符で始まり、同じ符で終わらなければなりません。直訳の引用符は、マークの前にエスケープ文字 - `"または`' を置くか、反対のタイプの引用符を使用することで記述します:''42" が答え'です。引用符を二重にしても特別な意味はなく、auto-concatではスペースが必要なのでエラーになる。

演算子&&,||,and および orは、JavaScript や Lua と同様に、結果を決定したいずれかの値を出力します。For example, "" or "default" yields "default" instead of 1. Scripts which require a pure boolean value (0 or 1) can use something like !!(x or y) or (x or y) ? 1 : 0.

Auto-concatでは、すべてのケースで少なくとも1つのスペースまたはタブが必要になりました(v1のドキュメントでは、スペースが「あるべき」とされています)。

x(), y()のような複数文の式の結果は、最初の(一番左の)部分式ではなく、最後の(一番右の)部分式になります。v1、v2ともに、部分式は左から右の順番で評価されます。

カンマの後のEqualsは、割り当てられなくなりました:x:=y,y=zy=zは、代入ではなく非効率的な比較です。

:= += -= *= /= ++ -- x := y, y += 2のように、単独で使うか、他の演算子と組み合わせて使うかにかかわらず、一貫した動作をします。従来は、式内でエラーが発生した場合や、数学演算で空白の値が使用された場合に、動作に違いがありました。

!==と同様に常に大文字と小文字を区別するようになり、!==は ==と対になるものとして追加された。

<>は、廃止されました。

// は、浮動小数点数が与えられた場合、例外を投げるようになりました。以前は、負の浮動小数点と負の整数で結果が矛盾していました。

|,^,&,<<、および、>>は、浮動小数点数が与えられた場合、整数に切り捨てられるのではなく、例外を投げるようになりました。

科学的記数法は、小数点以下がなくても使用可能です(ただし、いずれにせよ浮動小数点数を生成します)。Scientific notation is also supported when numeric strings are converted to integers (for example, "1e3" is interpreted as 1000 instead of 1).

関数呼び出しでは、パラメータリストの開括弧の前にスペースやタブがなければ、どの関数を呼び出すかを指定するために、事実上どんな下位式でも使用できるようになりました。For example, MyFunc() would call the value of MyFunc regardless of whether that is the function's actual name or a variable containing a function object, and (a?b:c)() would call either b or c depending on a. なお、x.y()は、まだ(x.y)(x)とほぼ同等のメソッド呼び出しですが、a[i]()(a[i])()と同等になったことに注意してください。

ダブルデフでは、変数名のソースとして(変数に限らず)ほぼすべての式が使用できるようになりました。例えば、DoNotUseArray%n+1%%(%triple%)%は有効です。ref := &var, value := %ref%のように、VarRefの再参照にもダブルデリフ構文が使われるようになりました。

funcName[""]()およびfuncName.()の式は、関数を名前で呼び出さなくなりました。.() のようにメソッド名を省略すると、ロードタイムエラーメッセージが表示されるようになりました。関数は、名前ではなく、参照によって呼び出したり、扱ったりする必要があります。

右辺値を持たないvar :=は、ロード時にエラーとして扱われます。v1で、これはvar := ""と等価でしたが、他の式と組み合わせると無言で失敗します:x :=, y :=.

リテラル文字列の後に曖昧な単項/二項演算子が続く場合、ロード時にエラーが報告されます。For instance, "new counter:" ++Counter is probably supposed to increment and display Counter, but technically it is invalid addition and unary plus.

word ++ and word -- are no longer expressions, since word can be a user-defined function (and ++/-- may be followed by an expression which produces a variable reference). 単独でポストインクリメント式やポストデクリメント式を書くには、変数と演算子の間のスペースを省くか、変数や式を括弧で囲むかします。

word ? x : yは、まだ3項表現ですが、word1 word2 ? x : yのように単語で始まるより複雑な場合は、常にword1への関数呼び出しと解釈されます(そのような関数が存在しない場合であってもです。)。複雑な条件を持つ単体の3元式を書くには、条件を括弧で囲みます。

The new is operator such as in x is y can be used to check whether value x is an instance of class y, where y must be an Object with a Prototype property (i.e. a Class). This includes primitive values, as in x is Integer (which is strictly a type check, whereas IsInteger(x) checks for potential conversion).

キーワードcontainsinは将来の使用のために予約されています。

&var(address-of) がStrPtr(var)ObjPtr(obj)に置き換えられ、より明確に意図を示し、エラーチェックを強化しました。v1では、address-ofは、varの内部文字列バッファのアドレスを返し、たとえそれが数値(オブジェクトではない)を含んでいたとしても、そのアドレスを返していました。また、オブジェクトのアドレスを取得するために使用され、間違ったタイプのアドレスを取得すると、悲惨な結果になることがあります。

&var参照演算子になり、すべてのByRefと OutputVar パラメータで使用され、明快さと柔軟性が向上しました(他の言語の変更も可能になります)。詳しくは、変数参照(VarRef)を参照してください。

式の評価時に、文字列の長さがキャッシュされるようになりました。これにより、パフォーマンスが向上し、文字列が2進数の0を含むことができるようになります。特に:

ほとんどの関数はまだヌル終端文字列を想定しているので、最初の2進数のゼロまでしか「見えない」のです。例えば、MsgBoxは、文字列のうち最初の2進数のゼロより前の部分のみを表示します。

*(deref)演算子は削除されました。代わりにNumGetを使用してください。

~ (bitwise-NOT) 演算子は、常に入力を64ビットの符号付き整数として扱うようになりました。0から4294967295までの値を符号なし32ビットとして扱わなくなりました。

論理右ビットシフトに>>>>>>=が追加されました。

太矢印の関数を追加しました。The expression Fn(Parameters) => Expression defines a function named Fn (which can be blank) and returns a Func object or Closure object. When called, the function evaluates Expression and returns the result. When used inside another function, Expression can refer to the outer function's variables (this can also be done with a normal function definition).

ファットアロー構文は、メソッドやプロパティのゲッター/セッターの定義にも使用できます(この場合、メソッド/プロパティの定義自体は式ではなく、その本体が式を返すだけです)。

メンバーアクセス(ドット)の左側で、リテラルナンバーが完全にサポートされるようになりました。例えば、0.1は数値ですが、0.min0.1.minは、ベースオブジェクトが扱えるminプロパティにアクセスします(プリミティブ値参照)。1..2または1.0.2は、数字 1.0 の後にプロパティ 2 が続くものです。使用例としては、測定単位、リテラルバージョン番号、範囲などを実装することが考えられます。

x**y:Where x and y are integers and y is positive, the power operator now gives correct results for all inputs if in range, where previously some precision was lost due to the internal use of floating-point math. オーバーフロー時の動作は未定義です。

Objects (Misc)

こちらもご覧ください:オブジェクト

.でアクセスするプロパティと、[]でアクセスするデータ(アイテム、配列、マップ要素)は区別されるようになりました。例えば、dictionary["Count"]は "Count"の定義を返し、dictionary.Countは、その中に含まれる単語の数を返すことができる。ユーザー定義オブジェクトは、__Itemプロパティを定義することでこれを利用することができます。

プロパティやメソッドの名前が事前にわからない場合、パーセント記号を使ってアクセスすることができる(しなければならない)。例えば、obj.%varname%()は、v2のobj[varname]()と同等です。[]は、データ(配列要素など)に使用します。

アドホック・オブジェクトを構築するためのリテラル構文は、やはり基本的に{name:value}です。しかし、プレーンオブジェクトは現在「配列要素」ではなく「プロパティ」しか持たないため、他のコンテキストでプロパティにアクセスする方法との一貫性を保つために、ルールが少し変更されました:

base.Method()の "base" という言葉の使用は、2つの概念をよりよく区別するために、supersuper.Method())に置き換えられています:

Calling a user-defined object without explicitly specifying a method name now results in a call to the "Call" method instead of the "" method. For example, %Fn%() previously resulted in a call to Fn.(), but the v2 expression Fn() results in a call to Fn.Call(). Func objects no longer implement the nameless method. It is no longer valid to omit the method name in a method call, but Fn.%""%() works in place of Fn.().

this.Method()は、Fn[this]()の代わりにFn.Call(this)Fnはメソッドを実装した関数オブジェクト)を呼び出します(v1ではFn[this]()に関数が含まれていない限りFn.__Call(this)を呼び出すことになります)。関数オブジェクトは、明示的なメソッド呼び出しにのみ使用される__Callの代わりに、Callメソッドを実装する必要があります。

Classname() (formerly new Classname()) now fails to create the object if the __New method is defined and it could not be called (e.g. because the parameter count is incorrect), or if parameters were passed and __New is not defined.

式内で生成されたオブジェクトや関数から返されたオブジェクトは、式の評価が完了するまで保持され、その後解放されるようになりました。これにより、パフォーマンスが若干向上し、オブジェクトが早期に解放される心配がなく、式内のメモリ管理に一時的なオブジェクトを使用することができます。

オブジェクトには、2進数の0を含む文字列値(キーは不可)を含めることができます。オブジェクトのクローンは、文字列のバイナリデータを、保存された文字列の長さまで保存します(容量ではありません)。Historically, data was written beyond the value's length when dealing with binary data or structs; now, a Buffer object should be used instead.

x.y := zのような代入式は、<c2>x.y</c2> の実装方法に関係なく、常に<c1>z</c1> の値を返すようになりました。プロパティセッターの戻り値は無視されるようになりました。以前:

x.y(z) := vがシンタックスエラーになりました。以前はx.y[z] := vと同等でした。In general, x.y(z) (method call) and x.y[z] (parameterized property) are two different operations, although they may be equivalent if x is a COM object (due to limitations of the COM interface).

Concatenating an object with another value or passing it to Loop is currently treated as an error, whereas previously the object was treated as an empty string. This may be changed to implicitly call .ToString(). Use String(x) to convert a value to a string; this calls .ToString() if x is an object.

IDispatch(COMインターフェース)を介してオブジェクトが呼び出された場合、呼び出し元に引き渡せない捕捉できない例外は、エラーダイアログを発生させます。(呼び出し側は、具体的な詳細を伴わない追加のエラーダイアログを表示することも、しないこともあります)。これは、ComObjConnectの使用により呼び出されるイベントハンドラにも適用されます。

関数

関数が正式に受け付ける以上のパラメータで動的に呼び出すことができなくなりました。

Variadic functions are not affected by the above restriction, but normally will create an array each time they are called to hold the surplus parameters. この配列が不要な場合は、パラメータ名を省略できるようになり、作成されないようになりました:

AcceptsOneOrMoreArgs(first, *) {
  ...
}

これは、追加パラメータが不要なコールバックに使用することができます。

Variadic function calls now permit any enumerable object, where previously they required a standard Object with sequential numeric keys. 列挙者が1回の反復で複数の値を返す場合、最初の値のみが使用されます。For example, Array(mymap*) creates an array containing the keys of mymap.

変数型関数呼び出しは、以前は名前付きパラメータを中途半端にサポートしていました。これは、名前付きパラメータの適切な実装を妨げる可能性を排除するために、無効化されています。

ユーザー定義関数は、新しいキーワードunsetをパラメータのデフォルト値として使用し、値が提供されていない場合にパラメータを "unset" にすることができます。その後、この関数は IsSet() を使用して、値が提供されたかどうかを判断することができます。unsetは現在、他のコンテキストでは許可されていません。

Scripts are no longer automatically included from the function library (Lib) folders when a function call is present without a definition, due to increased complexity and potential for accidents (now that the MyFunc in MyFunc() can be any variable). #Include <LibName>は従来通り動作します。将来のリリースでは、モジュールのサポートに取って代わられる可能性があります。

Variadic built-in functions now have a MaxParams value equal to MinParams, rather than an arbitrary number (such as 255 or 10000). Use the IsVariadic property to detect when there is no upper bound.

ByRef

ByRefパラメータは、ByRef paramの代わりに&paramを使用して宣言されるようになり、使い方に若干の違いがあります。

ByRefパラメータが暗黙のうちに呼び出し元の変数への参照を取ることはなくなりました。その代わり、呼び出し側は参照演算子&var)を使って明示的に参照を渡す必要があります。これにより、参照を別の場所に保存し、可変長引数関数で受け入れ、可変長引数コールで渡すなど、より柔軟な対応が可能になります。

パラメータがByRefとマークされている場合、VarRef以外の値を明示的に渡そうとすると、エラーが発生します。それ以外の場合は,param is VarRefで参照を確認し,IsSetRef(param)で対象の変数に値があるかどうかを確認し,%param%で明示的に参照解除することができます.

ByRefパラメータは、同じ関数が再帰的に呼び出されたときに、前のインスタンスからローカル変数への参照を受け取ることができるようになりました。

ネストされた関数

ある関数は、別の関数の内部で定義することができます。ネストされた関数は、(適切な条件下で)包含関数から非静的ローカル変数を自動的に「捕捉」し、包含関数が戻った後に使用できるようにすることができます。

また、新しい"太矢印"=>演算子を使って、ネストした関数を作成することができます。

詳しくは、「ネストされた関数」をご覧ください。

未分類(Uncategorized)

宣言された変数やオプションのパラメータを初期化する場合は、=の代わりに:= を使用する必要があります。

return %var%が二重参照になりました。以前はreturn varと同等でした。

#Includeは、デフォルトでカレントファイルを含むディレクトリからの相対パスとなります。そのパラメータは、オプションで引用符で囲むことができるようになりました。

#ErrorStdOutのパラメータを引用符で囲むことができるようになりました(オプション)。

ラベル名は、文字、数字、アンダースコア、非ASCII文字(変数、関数などと同じ)のみで構成することが求められるようになりました。

関数内で定義されたラベルはローカルスコープを持ち、その関数内でのみ表示され、他の場所で定義されたラベルと衝突することはありません。ローカルラベルを外部から(組み込み関数でも)呼び出すことはできません。代わりにネストされた関数を使用することで、ローカル変数を完全に使用することができます。

for k, v in obj:

コンマのエスケープには、もはや何の意味もありません。Previously if used in an expression within a command's parameter and not within parentheses, `, forced the comma to be interpreted as the multi-statement operator rather than as a delimiter between parameters. このように動作するのはコマンドのみで、関数や変数宣言は対象外でした。

エスケープシーケンス`sは、`tがサポートされている場所であればどこでも許可されるようになりました。これまでは #IfWin と (Join でしか認められていませんでした。

*/ を行末に置いて複数行のコメントを終了できるようになり、他の言語での /* */ の動作に関する共通の混乱点を解決しました。(例えば、*/で終わるホットストリングでは)曖昧さが生じる恐れがあるため、*/の前に/*がないものは無視されるようになりました(AHK_L revision 54での変更点を取り消します)。

64ビット符号付き整数のサポート範囲外の整数定数や数値文字列は、最小/最大値で上限が設定されるのではなく、オーバーフロー/ラップアラウンドするようになりました。これは数学の演算子と一致しているので、9223372036854775807+1 == 9223372036854775808(ただしどちらも-9223372036854775808が出ます)。これにより、64ビット値に対するビット演算が容易になります。

数値文字列の場合、数字の前にスペースとタブ以外の空白文字が許されるケースは少なくなっています。一般的なルールとして(v1、v2ともに)スペースとタブのみが許可されていますが、Cランタイムライブラリの規約により他の空白文字が許容される場合もあります。

Else can now be used with loops of any type and Catch. For loops の場合は、ループの反復回数が0回だった場合に実行されます。For Catch, it is executed if no exception is thrown within Try (and is not executed if any error or value is thrown, even if there is no Catch matching the value's class). Consequently, the interpretation of Else may differ from previous versions when used without braces. 事例:

if condition
{
    while condition
        ; 各繰り返しで実行される ;ステートメント
} ; これらの中括弧は現在必須であり、そうでなければ else は while と関連付けられる。
else
    ; 条件が偽の場合に実行されるステートメント

継続の部

Smart LTrim:デフォルトの動作は、継続セクションオプション以下の最初の行の先頭のスペースまたはタブの数を数え、それ以降の各行からその数のスペースまたはタブを削除することです。最初の行にスペースとタブが混在している場合、最初の種類の文字だけがインデントとして扱われます。もし、ある行が最初の行より小さくインデントされたり、間違った文字でインデントされた場合、その行のすべての先頭の空白はそのまま残されます。

引用符は、継続部分が引用符で囲まれた文字列の中で始まる場合、自動的にエスケープされます(すなわち、リテラル文字として解釈されます)。これにより、複数行の文字列で引用符をエスケープする必要がなくなり(開始と終了の引用符が継続部分の外にある場合)、かつ複数行の式に引用符付きの文字列を含めることができます。

継続セクションの上の行が名前文字で終わり、そのセクションが引用文字列の中で始まらない場合、名前と継続セクションの内容を分離するために、1つのスペースが自動的に挿入されます。これにより、returnや関数呼び出し文などに続く複数行の表現に、継続セクションを使用することができます。また、変数名が他のトークン(または名前)と結合して無効な式になることがないようにします。

式中の改行文字(`n)はスペースとして扱われます。これにより、複数行の式を、デフォルトのオプション(Joinの省略など)で継続セクションを使って書くことができます。

これらの文字をエスケープする必要がなくなったため、,% のオプションは削除されました。

継続セクションの可能性のあるオプションに(Joinオプションの一部以外として)(または)が現れる場合、全体の行は継続セクションの開始として解釈されません。つまり、(x.y)()(x=y) && z()のような行は、式として解釈されます。複数行の表現は、最初の物理行に少なくとも1つの他の(または)がある場合に限り、行頭の開括弧で始めることもできます。例えば、式全体を(( ... ))で囲むことができます。

上記の場合を除き、無効なオプションが存在する場合、無効なオプションを無視するのではなく、ロードタイムエラーを表示します。

(で始まり、:で終わる行は、(がラベル名として有効でなくなったため、ラベルのように見えることを理由に継続セクションの開始対象から除外されなくなりました。これにより、(Join:のようなものが継続部分を開始することが可能になります。ただし、(:はエラーで、(::はホットキーのままです。

式や関数・プロパティ定義では、(/[/{は、対応する)/]/}と一致させなければならないという事実を利用した新しい行継続の方法がサポートされています。つまり、ある行に閉じない(/[/{ が含まれている場合、開閉記号の数が釣り合うまで、後続の行と結合されます。Brace { at the end of a line is considered to be OTB (rather than the start of an object literal) if there are no other unclosed symbols and the brace is not immediately preceded by an operator.

継続行

行の継続は、記号が式演算子とみなされる文脈について、より選択的になりました。一般に、カンマや式演算子は、ホットストリングやディレクティブ(#HotIf以外)、閉じない引用文字列の後など、テキスト文脈での継続に使用できなくなりました。

行末の式演算子に対して、行の継続が機能するようになりました。

is, in, contains は行の継続に使えますが、in,contains は演算子としてまだ予約/未実装となっています。

andorisincontainsは、代入や他の二項演算子が続いても、もはや有効な変数名ではないので、行継続演算子として機能します。一方、v1では、and/orの後にany ofが続く場合は例外としました:<>=/|^:,

VeryLongNestedClassNameのように、行頭で.の右側にスペースやタブがなかった場合、継続に.が使われると、2つの行は自動的にスペースで区切られなくなります。なお、x .123は常にプロパティアクセス(自動連結ではない)、x+.123はスペースの有無にかかわらず動作します。

種類

一般的に、値の型に依存するようなコードでは、v2の方がより一貫した結果を得ることができます。

v1では、変数に文字列とキャッシュされた2進数の両方を含めることができ、変数が数値として使用されるたびに更新されます。このキャッシュされた2進数が値の型を検出する唯一の手段であるため、var+1abs(var)などの式で内部的に行われるキャッシュは、副作用としてvarの「型」を効果的に変更します。v2はこのキャッシュを無効にするため、str := "123"は常に文字列、int := 123は常に整数になります。そのため、strはもともと純粋な数字が割り当てられている場合を除き、数字として使われるたびに(初回だけでなく)変換する必要があります。

The built-in "variables" true, false, A_PtrSize, A_Index and A_EventInfo always return pure integers, not strings. v1では特定の最適化により文字列を返すことがありましたが、v2ではそのようなことはありません。

すべてのリテラル数値は、ロード時に純粋な2進数に変換され、その文字列表現は破棄されます。例えば、MsgBox 0x1MsgBox 1と同等であり、MsgBox 1.0000MsgBox 1.0と同等です(浮動小数点数のフォーマットが変更されたため)。数値を変数に格納したり、ユーザー定義関数から返したりしても、純粋な数値の状態を維持することができます。

浮動小数点数のデフォルトのフォーマット指定子が0.17g0.6fだった)になり、よりコンパクトで多くのケースでより正確になっています。デフォルトは変更できませんが、Formatを使用することで異なる書式を得ることができます。

引用リテラル文字列および引用リテラル文字列を連結した文字列は、無条件に非数値と見なされなくなりました。代わりに、変数に格納された文字列や関数から返された文字列と同じように扱われます。これには次のような意味があります:

演算子=!=は、オペランドが文字列の場合はアルファベット順に比較し、数値文字列の場合はアルファベット順に比較するようになりました。数値比較は、両方のオペランドが数値であり、少なくとも1つのオペランドが純粋な数値(文字列ではない)である場合にも実行されます。So for example, 54 and "530" are compared numerically, while "54" and "530" are compared alphabetically. また、変数に格納された文字列は、リテラル文字列と同じように扱われます。

関係演算子<,<=,>,>=を数値以外の文字列で使用すると、例外が発生するようになりました。従来は、入力が数値かアルファベットかによって比較されていましたが、リテラル引用文字列は常に非数値とみなされていました。代わりにStrCompare(a, b, CaseSense)を使用してください。

Type(Value)は、以下の文字列のいずれかを返す:String、Integer、Float、またはオブジェクトの特定のクラス。

Float(Value), Integer(Value) and String(Value) convert Value to the respective type, or throw an exception if the conversion cannot be performed (e.g. Integer("1z")). Number(Value) converts to Integer or Float. String(Value) calls Value.ToString() if Value is an object. (理想的には、オブジェクトから文字列への暗黙の変換でも行われるのですが、現在の実装ではこれが困難です)。

オブジェクト

オブジェクトは、より構造化されたクラス-プロトタイプのアプローチを採用し、クラス/静的メンバとインスタンスメンバを分離しています。多くの組み込みメソッドやObj関数が移動、名称変更、変更、削除されています。

混在していたObject型は、ObjectArrayMap(連想配列)に分割されました。

Objectは、すべてのユーザー定義および組み込みオブジェクトのルートクラスとなりました(VarRefおよびCOMオブジェクトは除きます)。Object.Prototypeに追加されたメンバーは、すべてのAutoHotkeyオブジェクトに継承されます。

演算子はクラスを期待するので、xはyは、ベースオブジェクトチェーンでy.Prototypeをチェックします。To check for y itself, call x.HasBase(y) or HasBase(x, y).

ユーザー定義クラスは、ObjectArrayMapなどの組み込みクラスを明示的に拡張することも可能です(ただし、拡張することが必ずしも有用とは限りません)。

新しいオペレーターは削除されました。代わりに、MyClass()のように演算子を省略するだけです。クラスではない別のオブジェクトを元にオブジェクトを構成するには、{}またはObject()で(あるいは他の手段で)作成し、そのベースを設定します。__Init__Newは、必要に応じて明示的に呼び出すことができますが、一般的にはクラスをインスタンス化するときにのみ適切です。

ネストされたクラス定義は、単純な値プロパティではなく、getおよびcallアクセッサ関数を持つ動的プロパティを生成するようになりました。これは、次のような行動をサポートするためです:

GetCapacityとSetCapacityを削除しました。

その他、冗長なObj関数(Objectの組み込みメソッドをミラーリングしたもの)を削除しました。ObjHasOwnProp(旧ObjHasKey)とObjOwnProps(旧ObjNewEnum)は、これらのメソッドを再定義したオブジェクト(およびそれらが定義されていないプリミティブプロトタイプ)を安全に検査するために保持されています。ObjCountはObjOwnPropCount(機能のみ、すべてのObjectに対して)に置き換えられ、Mapは独自のCountプロパティを持ちます。

ObjRawGetとObjRawSetは、GetOwnPropDescDefinePropに統合されました。Mapタイプ、メタファンクションの動作方法の変更、DefineProp自体がメタファンクションに取って代わるなど、当初追加した理由は他の変更に取って代わられた。

つまり、クラス名への代入は、ローカル変数がグローバルクラスの影になる場合(関数内で代入する場合はデフォルトで発生)を除き、オプションの警告ではなく、エラーになるようになりました。

プリミティブ値

プリミティブ値は、v1の「デフォルトのベースオブジェクト」の代わりに、メソッドやプロパティの呼び出しをその型に応じたプロトタイプオブジェクトに委ねることで、オブジェクトを模倣します。整数と浮動小数点数はNumberを拡張しています。文字列とNumberはPrimitiveを継承しています。PrimitiveとObjectはAnyを拡張します。これらはすべて、あらかじめ定義されたクラスとして存在します。

プロパティとメソッド

メソッドは、v2.0-a104からv2.0-a127までと異なり、プロパティに分離して定義されています。ただし、v1とは異なり、クラスメソッド定義(または組み込みメソッド)で作成されたプロパティは、デフォルトで読み取り専用となります。メソッドは、一般的にv1のように動作する新しい値プロパティを割り当てることによって、まだ作成することができます。

Objectクラスは、プロパティとメソッドを扱うための新しいメソッドを定義しています:DefineProp, DeleteProp, GetOwnPropDesc, HasOwnProp, OwnProps. すべての値(ComObjectを除く)に対して、追加のメソッドが定義されています:GetMethod, HasProp, HasMethod.

Object、Array、Mapはそれぞれ別の型となり、配列の要素はプロパティとは別になりました。

すべての組み込みメソッドとプロパティ(baseを含む)は、ユーザー定義と同じ方法で定義されます。これにより、一貫した動作が保証され、組み込みとユーザー定義の両方のメンバーを検出、検索、再定義することができます。

プロパティがパラメータを受け付けない場合、パラメータは自動的にプロパティが返すオブジェクトに渡されます(または、投げられます)。

存在しないプロパティを取得しようとすると、__getが定義されていない限り、すべてのタイプの値またはオブジェクトに対してエラーとして扱われます。ただし、存在しないプロパティを設定すると、ほとんどの場合、作成されます。

多次元配列のハックを削除しました。x.y[z]:=1x.yにオブジェクトが生成されなくなり、x.__itemが2つのパラメータを扱わない限り(またはx.__item.__itemが扱うなど)x[y,z]はエラーになります。

プロパティがgetを定義し、setを定義していない場合、値を代入すると、プロパティをオーバーライドする代わりにthrowが発生します。

DefinePropは、メタファンクションを定義することなく、特定のプロパティの取得、設定、または呼び出し時の動作を定義するために使用することができます。クラスのプロパティ定義とメソッド定義は同じ仕組みを利用しているため、プロパティのゲッター/セッターとメソッドを同名で定義することが可能です。

{} オブジェクトリテラルが、所有プロパティの値やオブジェクトの base を直接設定するようになりました。つまり、__Setやプロパティセッターはもはや呼び出されない(これは通常、パラメータリスト内でbaseが設定されている場合にのみ可能である)。

静的クラス変数

静的/クラス変数のイニシャライザーは、静的な__Initメソッドのコンテキスト内で実行されるようになったので、これはクラスを参照し、イニシャライザーはローカル変数を作成することができます。これらは、クラスが初めて参照されたときに評価されます(自動実行部が始まる前に評価されるのではなく、厳密には定義順に評価されます)。クラスがすぐに参照されない場合は、実行中にクラス定義に到達した時点で評価されるため、グローバル変数の初期化は、クラスに入れずに最初に行うことができます。

Meta-Functions

メタファンクションが大幅に簡略化され、通常のメソッドと同じように動作するようになりました:

メソッドやプロパティのパラメータは、Arrayとして渡されます。これは、連鎖するベース/スーパークラスの呼び出しを最適化し、(MaxParamsの検証との組み合わせで)作者に引数を処理することを奨励します。For __setの場合、代入される値は別途渡されます。

this.__call(name, args)
this.__get(name, args)
this.__set(name, args, value)

定義されたプロパティやメソッドは、ベースオブジェクトで定義されたかどうかにかかわらず、メタファンクションよりも優先されます。

__Call is not called for internal calls to __Enum (formerly _NewEnum) or Call, such as when an object is passed to a for-loop or a function object is being called by SetTimer.

静的メソッド __New は、そのクラスで定義されているか、スーパークラスから継承されている場合、各クラスの初期化時に呼び出されます。詳しくは、静的/クラス変数(上)、および、クラスの初期化をご覧ください。

Array

クラス配列のオブジェクト拡張

配列オブジェクトは、インデックス1が最初の要素である値のリストまたはシーケンスを含んでいます。

配列の要素を代入・取得する場合、インデックスの絶対値が 1 から配列のLengthの間でなければなりません。そうでない場合は例外が発生します。配列のサイズは、適切な方法で要素を挿入または削除するか、Lengthを代入することで変更することができます。

現在、要素にアクセスする際には括弧が必要です。例えば、a.1はプロパティを指し、a[1]は要素を指します。

負の値を使用すると、逆方向のインデックスを作成することができます。

CloneDeleteInsertAtPopPushRemoveAtの使い方は基本的に変わりません。HasKeyはHasに名称変更されました。Lengthがプロパティになりました。Capacityプロパティを追加しました。

配列は、Array(values*)または[values*]で構築することができます。変数型関数は、パラメータの配列を受け取ります。また、配列はいくつかの組み込み関数でも作成されます。

For-Loop の使用法は、for val in arrまたはfor idx, val in arrで、デフォルトではidx = A_Indexです。つまり、値がない要素も列挙され、変数が1つしか渡されない場合はインデックスが返されない。

Map

Mapオブジェクトは、v1オブジェクトに似た機能を持つ連想配列ですが、より曖昧さがありません。

現在、Floatキーは文字列に変換されたままです。

a.bはプロパティを、a["b"]は要素を意味します。v1とは異なり、配列の要素を代入することで誤ってプロパティやメソッドを無効化することはできません。

マップにDefaultプロパティが定義されていない限り、存在しない要素の値を取得しようとすると例外がスローされます。MapObj.Get(key, default)は、各リクエストに対して明示的にデフォルト値を提供するために使用することができます。

キーと値のペアのリストからマップを作成するには、Map(Key, Value, ...)を使用します。

列挙

列挙者モデルの変更:

配列要素とプロパティが分離されたため、プロパティの列挙にはOwnPropsを呼び出して明示的に列挙者を作成する必要があります。

バウンド関数

When a bound function is called, parameters passed by the caller fill in any positions that were omitted when creating the bound function. For example, F.Bind(,b).Call(a,c) calls F(a,b,c) rather than F(,b,a,c).

COMオブジェクト(ComObject)

COMラッパーオブジェクトは、バリアントタイプによっていくつかの異なるクラスのインスタンスとして識別されるようになりました(以前のように、どのメソッドとプロパティをサポートするかに影響します):

これらのクラスは、obj が ComObjectなどのタイプチェックに使用できます。ComValue型、ComObjArray型、ComValueRef型(ComObjectは除く)のオブジェクトは、それぞれのプロトタイプオブジェクトを変更することにより、プロパティとメソッドを定義することができます。

ComObject(CLSID)は、ComObjectを作成します。つまり、これは新しいComObjCreateです。

注:古いコードを更新しているときに、ComObjectにIntegerを渡したためにTypeErrorが発生した場合、代わりにComValueを呼び出す必要がある可能性があります。

ComValue(vt, value)は、ラッパーオブジェクトを作成します。上記のいずれかのクラスのインスタンスを返すことができます。これは、ComObjParameter(vt, value)ComObject(vt, value)、およびパラメータとしてバリアント型を使用していた他の名前を置き換えます。は、正しいバイナリ値を持つ整数を必要とするのではなく、(COMの規約に従って)適切な型に変換されます。特に、以下のものは整数を渡されたときの挙動が以前と異なります:R4, R8, Cy, Date. ポインタ型は、従来通り純粋な整数アドレスか、オブジェクト/ComValueのいずれかを許可します。

ComObjFromPtr(pdsp)ComObjEnwrap(dsp)と同様の関数ですが、ObjFromPtrのようにポインタに対してAddRefを呼び出すことはしません。v1での同等品はComObject(9, dsp, 1)です。v1で第3パラメータを省略するとAddRefが発生しました。

ComValueとComObjFromPtrは、AddRefが自動的に呼び出されることはないので、その点ではv1のComObject(9, value, 1)ComObject(13, value, 1)と同じ挙動をすることに注意。これは、古いスクリプトを更新する際に、ObjAddRef(value)を追加する必要があるとは限らず、多くのスクリプトが古い関数を間違って使用していたためです。

COM wrapper objects with variant type VT_BYREF, VT_ARRAY or VT_UNKNOWN now have a Ptr property equivalent to ComObjValue(ComObj). This allows them to be passed to DllCall or ComCall with the Ptr arg type. It also allows the object to be passed directly to NumPut or NumGet, which may be used with VT_BYREF (access the caller's typed variable), VT_ARRAY (access SAFEARRAY fields) or VT_UNKNOWN (retrieve vtable pointer).

COM wrapper objects with variant type VT_DISPATCH or VT_UNKNOWN and a null interface pointer now have a Ptr property which can be read or assigned. 非NULLポインタが割り当てられると、このプロパティは読み取り専用になります。This is intended for use with DllCall and ComCall, so the pointer does not need to be manually wrapped after the function returns.

ComObjArrayの列挙がArrayと一致するようになりました。つまり、for value in arrfor index, value in arrではなく、for value, vartype in arrです。。The starting value for index is the lower bound of the ComObjArray (arr.MinIndex()), typically 0.

整数型I1、I8、UI1、UI2、UI4、UI8は、StringではなくIntegerに変換されるようになりました。これらはCOMコールで稀に発生しますが、VT_BYREFラッパーにも適用されます。VT_ERRORはIntegerに変換されなくなり、代わりにComValueが生成されます。

COMオブジェクトが、プロパティやメソッドの呼び出しに失敗したときに、A_LastErrorを設定しなくなりました。

デフォルトのプロパティ

COMオブジェクトは「デフォルト・プロパティ」を持つことができ、これには2つの用途があります:

AutoHotkey v1にはデフォルトプロパティの概念がなかったため、COMオブジェクトラッパーはプロパティ名が省略された場合、デフォルトプロパティを呼び出していました(例:obj[]またはobj[,x].

However, AutoHotkey v2 separates properties from array/map/collection items, and to do this obj[x] is mapped to the object's default property (whether or not x is present). AutoHotkeyオブジェクトの場合、これは__Itemです。

配列やコレクションを表すCOMオブジェクトの中には、デフォルトのプロパティを公開していないものがあるため、v2では[]でアイテムにアクセスすることができません。例えば、JavaScriptの配列オブジェクトや、JavaScriptで通常使用される他のいくつかのオブジェクトは、配列要素をプロパティとして公開します。このような場合、arr.%i%は配列の要素-プロパティにアクセスするために使用することができます。

When an AutoHotkey v2 Array object is passed to JavaScript, its elements cannot be retrieved with JavaScript's arr[i], because that would attempt to access a property.

COM呼び出し

Calls to AutoHotkey objects via the IDispatch interface now transparently support VT_BYREF parameters. This would most commonly be used with COM events (ComObjConnect).

For each VT_BYREF parameter, an unnamed temporary var is created, the value is copied from the caller's variable, and a VarRef is passed to the AutoHotkey function/method. リターン時には、一時的な変数から呼び出し元の変数に値がコピーされます。

関数/メソッドは、パラメータをByRef(&付き)で宣言するか、明示的に再参照することで、値を割り当てることができます。

例えば、VT_BYREF|VT_BOOL型のパラメータは、以前はComObjRefオブジェクトを受け取り、pbCancel[] := trueまたはNumPut(-1, ComObjValue(pbCancel), "short")という値が割り当てられたはずです。これで、パラメータを&bCancelと定義してbCancel := trueのように代入することも、pbCancelと定義して%pbCancel% := trueのように代入することもできるようになりました。

ライブラリ

削除:

改名:

Removed Commands (Details)

全リストは上記をご覧ください。

EnvUpdateは削除されましたが、以下のようにSendMessageの単純な呼び出しに置き換えることができます:

SendMessage(0x1A, 0, StrPtr("Environment"), 0xFFFF)

StringCaseSenseが削除されたため、!=は常に大文字小文字を区別せず(ただし!==は大文字小文字を区別しない非等号のために追加)、=!=もASCII文字に対してのみ大文字を無視します。任意のモードで文字列を比較できるStrCompareを追加しました。様々な文字列関数にCaseSenseパラメータが追加され、大文字小文字の区別やロケールモードを指定することができるようになりました。

変更されたコマンド/ファンクション

セクションタイトルについて:v2にはコマンドはなく、関数だけです。タイトルは両バージョンを指しています。

SendEventメソッドでAltイベントを送信したときに、BlockInputが一瞬だけ無効になることがなくなりました。これはもともと、Windows XPの一部のバージョンで、BlockInputが人工的なAltイベントをブロックしてしまうというバグを回避するために行われたものです。

Chr(0)は、2進数の0を含む、長さ1の文字列を返します。これは、文字列の2進数ゼロのサポートが改善された結果です。

ClipWait now returns 0 (false) if the wait period expires, otherwise 1 (true). ErrorLevelを削除しました。0を指定しても、0.5を指定したのと同じではなく、最短の待ち時間が発生するようになりました。

ComObj():この機能は、ワイルドカードのような名前で、さまざまな接尾辞をつけることができました。ComObjActive(CLSID),ComObjParameter(vt, value),ComObjEnwrap(dsp)のように、特定の種類のパラメータでよく使われる名前もありました。その代わり、関数やクラスが別々になり、ワイルドカードの名前もなくなりました。詳細は「COMオブジェクト(ComObject)」を参照してください。

Control:Control関数SendMessageと PostMessageで使用されるControlパラメータにいくつかの変更が加えられました:

ControlGetFocusは、ClassNNの代わりにコントロールのHWNDを返すようになり、ウィンドウにフォーカスされたコントロールがないことを正常に判断した場合、エラーがあると見なされなくなりました。

ControlMoveControlGetPosControlClickで、ウィンドウ座標の代わりにクライアント座標(GuiControlのような)を使用するようになりました。クライアント座標は、ウィンドウのタイトルバーとボーダーを除いたクライアント領域の左上からの相対値です。(コントロールはクライアントエリア内でのみレンダリングされます)。

ControlMoveControlSendControlSetTextは、他のControl関数と同様にパラメータの順序を使用するようになりました。つまり、Control、WinTitle、WinText、ExcludeTitle、ExcludeTextは、常に一緒に(パラメータリストの最後に)まとめられ、記憶しやすくなっています。

すべてのモードは何かに対して相対的であるため、CoordModeはモードとして "Relative"を受け付けなくなりました。"Window"と同義語だったので、代わりにそちらを使ってください。

DllCall:後述のDllCallの項を参照。

Editは、シェル動詞 "edit "が登録されていない場合、.iniファイルタイプに対してフォールバック動作をしていました。スクリプトファイルには.iniという拡張子は期待できないため、これを削除しました。AutoHotkey.iniは、AutoHotkeyの古いバージョンではデフォルトのスクリプト名でした。

Editは、スクリプトがstdinから読み込まれた場合、*のためのエディタを開こうとするのではなく、何もしないようになりました。

EnvSet now deletes the environment variable if the Value parameter is completely omitted.

Exitは、これまで、スクリプトが永続的でない場合、Exitを呼び出したスレッドによって中断された他のスレッドがあったとしても、ExitAppとして動作していました。もはや、これ以上ないほどです。その代わり、常に現在のスレッドを適切に終了させ、(非永続的な場合)最後のスレッドが終了した後にのみスクリプトを終了させます。これにより<c2>finally</c2>文が実行されてローカル変数が解放され、ローカル変数に含まれるオブジェクトに対して__deleteが呼び出される可能性があります。

FileAppendは、FileReadおよびFileOpenと同様に、行末の変換を行わないことをデフォルトとしています。FileAppendとFileReadは、オプションの接頭辞を置き換える別のOptionsパラメータを持ち、オプションのエンコーディング名(FileReadの*Pnnnオプションに取って代わる)を含めることができます。FileAppend、FileRead、FileOpenは、行末変換を有効にするために"`n"を使用します。FileAppend and FileRead support an option "RAW" to disable codepage conversion (read/write binary data); FileRead returns a Buffer object in this case. This replaces *c (see ClipboardAll). FileAppend may accept a Buffer-like object, in which case no conversions are performed.

FileCopyFileMoveで、コピー元のパスに*または?がなく、ファイルが見つからなかった場合に例外が発生するようになりました。ただし、ソースパスにワイルドカードが含まれている場合、0個のファイルをコピーまたは移動することは、依然としてエラーとはみなされません。

FileOpenがファイルを開くのに失敗した場合、例外を投げるようになりました。そうでなければ、実際の障害発生箇所ではなく、オブジェクトに最初にアクセスしようとしたときに例外が発生します(スクリプトが障害をチェックしない場合)。

File.RawRead:変数を直接渡す場合、その変数の内部文字列バッファのアドレスは使用されなくなります。そのため、アドレスを含む変数を直接渡すことができる(v1ではvar+0のようなものが必要であったが)。

For buffers allocated by the script, the new Buffer object is preferred over a variable; any object can be used, but must have Ptr and Size properties.

File.RawWrite:ただし、文字列(または文字列を含む変数)を受け取ることができ、その場合、Bytesは文字列のサイズ(バイト)をデフォルトとします。文字列には2進数のゼロを含むことができます。

File.ReadLineが常に行末として`r`n`r`nをサポートするようになり、行末を戻り値に含めないようになりました。EOL変換が有効でない場合、File.Readによって行末がそのままスクリプトに返されます。

FileEncodingで、コードページをCPプレフィックスなしで番号で指定できるようになりました。そのパラメータはもはやオプションではありませんが、まだ明示的に空白にすることができます。

FileExistは、すべてのディレクトリリストに含まれる..を無視するようになったので、dirが存在するが空である場合、FileExist("dir*")は真ではなく偽になりました。

FileGetAttribとA_LoopFileAttribに、リパースポイントやシンボリックリンクを表す「L」の文字が含まれるようになりました。

コンパイルされていないスクリプトの FileInstall は、コピー元とコピー先が同じパスの場合、ファイルをコピーしようとしなくなりました(相対パスを解決した後、コピー元が A_WorkingDir ではなく A_ScriptDir への相対パスになっていたため)。v1ではErrorLevelが1に設定されていましたが、これはほとんど気づかれませんでした。2つの異なるパスでファイルを自分自身にコピーしようとすると、やはりエラーになります。

FileSelectFile(現在はFileSelectという名前)には、オプション4とMでアクセスできる2つのマルチセレクトモードがありました。オプション4と対応するモードは削除され、しばらくは文書化されていませんでした。FileSelectでマルチセレクトモードを使用した場合、C:\Dir`nFile1`nFile2のような文字列ではなく、パスのArrayを返すようになりました。各配列要素には、ファイルのフルパスが含まれます。ユーザーがキャンセルした場合は、配列は空になります。

FileSelectは、従来のGetOpenFileName/GetSaveFileName APIに代わり、Windows Vista以降に存在するIFileDialog APIを使用するようになりました。これにより、ダイアログがカレントワーキングディレクトリを変更することに関連する(ビルトインの)回避策が不要になります。

Filterが省略された場合、FileSelectはデフォルトで "Text Documents (*.txt)"という冗長なフィルターを持たないようになりました。

FileSelectで、スペース*.extを含むパターンのようなフィルターパターンからスペースを取り除かなくなりました。テストでは、パターンの両側にあるスペース(*.cpp; *.hのセミコロンの後など)は、すでにOSによって無視されているので、悪影響はないはずです。

Dオプション文字による「フォルダ選択」モードでFileSelectを使用できるようになりました。

FileSetAttribは、+、-、^ のプレフィックスが存在しない場合、何もしないのではなく、属性を上書きするようになりました。例えば、FileSetAttrib(FileGetAttrib(file2), file1)は、file2の属性をfile1にコピーします(file2が持っているものは追加し、持っていないものは削除します)。

FileSetAttribFileSetTimeです:the OperateOnFolders and Recurse parameters have been replaced with a single Mode parameter identical to that of Loop Files. 例えば、FileSetAttrib("+a", "*.zip", "RF")(Fileのみに対して再帰的に操作)。

NumpadキーとNumpad以外のキーの両方に対応するVKコードのNumpad以外の名前をGetKeyNameで返すようにしました。例えば、GetKeyName("vk25")は、NumpadLeftの代わりにLeftを返します。

GetKeyState now always returns 1 or 0 instead of On or Off.

GroupActivateは、ErrorLevelを設定する代わりに、アクティブ化のために選択されたウィンドウのHWND、または(すでにアクティブなウィンドウを除いて)一致しなかった場合は0を返すようになりました。

GroupAdd:Labelパラメータと関連する機能を削除しました。これは、GroupActivateが一致するウィンドウを見つけられなかった場合に検出するための直感的でない方法でした。GroupActivateの戻り値を代わりに使用する必要があります。

GroupDeactivateは、Alt+EscおよびAlt+Shift+Escシステム ホットキーとタスク バーに近い方法でウィンドウが選択されるようになりました。具体的には以下です。

ホットキーのデフォルトが、スクリプトの一番下の#HotIf(旧#If)にならないようになりました。Hotkey/HotstringおよびHotIfスレッドのデフォルトは、ホットキーと同じ基準なので、Hotkey A_ThisHotkey,"Off"は、現在のホットキーがコンテキスト依存であってもオフにします。他のすべてのスレッドは、自動実行セクションで使用される最後の設定がデフォルトで、それ自体は基準なしがデフォルトです(グローバルホットキー)。

Hotkey's Action parameter now requires a function object or hotkey name. ラベルや関数名はサポートされなくなりました。ホットキー名が指定されている場合は、そのホットキーの本来の機能が使用されます。また、以前とは異なり、#HotIf(旧#If)とも連動します。

HotkeyHotstringで、Suspendを免除するSオプション(新しい#SuspendExempt指令と同等)と、免除を無効にするS0オプションが追加されました。

"Hotkey If"をはじめとするIfサブコマンドを個別機能に置き換えました:HotIf, HotIfWinActive, HotIfWinExist, HotIfWinNotActive, HotIfWinNotExist.

HotIf(旧Hotkey If)は、andまたはor演算子を使用した式を認識するようになりました。v1では、これらの演算子はロード時に&&||に置き換えられるため、これは機能しませんでした。

Hotkey no longer has a UseErrorLevel option, and never sets ErrorLevel. 失敗した場合は例外がスローされます。Error messages were changed to be constant (and shorter), with the key or hotkey name in Exception.Extra, and the class of the exception indicating the reason for failure.

#HotIf(旧#If)は、1つのパラメータ(ThisHotkey)を持つ関数を暗黙のうちに作成するようになりました。As is the default for all functions, this function is assume-local. 式はローカル変数の作成とグローバル変数の読み込みが可能ですが、式に宣言を含めることができないため、グローバル変数に直接代入することはできません。

#HotIf has been optimized so that simple calls to WinActive or WinExist can be evaluated directly by the hook thread (as #IfWin was in v1, and HotIfWin still is). これにより、パフォーマンスが向上し、スクリプトがビジー/無反応の場合に問題が発生するリスクを低減することができます。This optimization applies to expressions which contain a single call to WinActive or WinExist with up to two parameters, where each parameter is a simple quoted string and the result is optionally inverted with ! or not. For example, #HotIf WinActive("Chrome") or #HotIf !WinExist("Popup"). これらの場合、任意の基準の組み合わせを持つ最初の表現は、表現またはウィンドウ基準のいずれかによって特定することができます。For example, HotIf '!WinExist("Popup")' and HotIfWinNotExist "Popup" refer to the same hotkey variants.

KeyHistory Nは、キーヒストリーを表示するのではなく、キーヒストリーバッファーのサイズを変更します。これは"#KeyHistory N"に置き換わるものです。

ImageSearch returns 1 (true) if the image was found, 0 (false) if it was not found, or throws an exception if the search could not be conducted. ErrorLevelが設定されていない。

IniDeleteIniReadIniWriteは、A_LastErrorをオペレーティングシステムのGetLastError()関数の結果に設定します。

要求されたキー、セクション、ファイルが見つからず、Defaultパラメータが省略された場合、IniReadは例外を投げる。Defaultに値が与えられた場合、""でも例外は発生しない。

InputHookShift+BackspaceBackspaceと同じように扱うようになり、代わりに`b'に転写されるようになりました。

InputBoxは、より使いやすくなるように構文が見直されました(パラメータが少なくなっています)。使い方はInputBoxを参照してください。

InStrCaseSensitiveパラメータがCaseSenseに変更され、0、1または "Locale"が指定できるようになりました。

InStrは、Occurrenceが負の場合(以前は結果が0になる)、右から左に検索するようになり、負のStartingPosが正のOccurrenceで使用されても右から左に検索しないようになりました。(ただし、StartingPosが負でOccurrenceが省略された場合は、右から左に検索されます)。これにより、ループ内での右から左への検索が容易になり、負のStartingPosを使用しても、左から右への検索が可能になります。

KeyWait now returns 0 (false) if the wait period expires, otherwise 1 (true). ErrorLevelを削除しました。

MouseClickMouseClickDragは、マウスボタンの入れ替えに関するシステム設定の影響を受けなくなりました。"Left"は常にプライマリボタン、"Right"はセカンダリボタンです。

MsgBoxは、最もよく使われるパラメータを優先し、使いやすさを向上させるために構文が変更されました。使い方の概要は、さらに下のMsgBoxを参照してください。

NumPut/NumGet:変数を直接渡す場合、その変数の内部文字列バッファのアドレスは使用されなくなります。そのため、アドレスを含む変数を直接渡すことができる(v1ではvar+0のようなものが必要であったが)。For buffers allocated by the script, the new Buffer object is preferred over a variable; any object can be used, but must have Ptr and Size properties.

NumPutのパラメータは、値の並びを変更し、各数値の前に(現在は必須の)タイプ文字列を置くことができるようになった。事例:NumPut("ptr", a, "int", b, "int", c, addrOrBuffer, offset). NumGetでもTypeが必須となりました。(In comparison to DllCall, NumPut's input parameters correspond to the dll function's parameters, while NumGet's return type parameter corresponds to the dll function's return type string.)

Object(obj)Object(ptr)を使って参照とポインタの変換を行っていましたが、ObjPtrAddRef(obj)ObjFromPtrAddRef(ptr)という別の関数に移行されました。また、これらの関数には、参照カウントをインクリメントしないバージョンもあります:ObjPtr(obj)ObjFromPtr(ptr)です。

OnClipboardChangeラベルが存在する場合、自動的に呼び出されることはなくなりました。代わりにv1.1.20で追加されたOnClipboardChange関数を使用してください。名前ではなく、関数オブジェクトを要求するようになりました。

OnErrorに名前ではなく、関数オブジェクトを要求するようになりました。後述の「エラー処理」もご覧ください。

OnExitコマンドは削除されました。代わりにv1.1.20で追加されたOnExit関数を使用してください。名前ではなく、関数オブジェクトを要求するようになりました。A_ExitReasonも削除され、その値はOnExitコールバック関数のパラメータとして利用できます。

OnMessageは、関数名(文字列)が渡されたときに使用されていた、メッセージごとの単一関数モードがなくなり、参照による関数のみを受け入れるようになりました。OnMessage(x, MyFunc)を使用します。MyFuncは文字通り関数の名前ですが、v1と同等のものはOnMessage(x, Func("MyFunc"))で、OnMessage(x, "MyFunc")と異なり、他の関数がメッセージxを監視し続けることができることに注意してください。OnMessage(x,"")OnMessage(x)がエラーになったので、メッセージの監視を止めるには、OnMessage(x, MyFunc, 0)を使います。失敗した場合、OnMessageは例外を投げます。

Pauseは、ホットキーの1行目で使用すると#MaxThreadsPerHotkeyの適用除外になるため、#p::Pauseは、一時停止を切り替えるのに適さなくなりました。Therefore, Pause() now only pauses the current thread (for combinations like ListVars/Pause), while Pause(Value) now always operates on the underlying thread. Value must be 0, 1 or -1. 第2パラメータを削除しました。

PixelSearchPixelGetColorは、他の関数との整合性のために、BGRの代わりにRGB値を使用します。どちらの関数も、問題が発生すると例外をスローし、ErrorLevelを設定しなくなりました。PixelSearch returns 1 (true) if the color was found. PixelSearchのスローモードは、デスクトップコンポジションとの非互換性により、ほとんどの最新システムで使用できないため、削除されました。

PostMessage:後述のSendMessageを参照してください。

Randomは、オペレーティングシステムの乱数発生器を利用し、いくつかの制限を解除し、より便利に使用できるように改良されました。

RegExMatchのオプションOとPが削除され、O(オブジェクト)モードが必須となりました。RegExMatch オブジェクトが列挙型(for-loop)に対応しました。マッチオブジェクトの構文が変更されました:

RegisterCallback was renamed to CallbackCreate and changed to better utilize closures:

レジストリ関数(RegReadRegWriteRegDelete):v1.1.21+で追加された新しい構文が唯一の構文となりました。ルートキーとサブキーが結合されます。Instead of RootKey, SubKey, write RootKey\SubKey. To connect to a remote registry, use \\ComputerName\RootKey\SubKey instead of \\ComputerName:RootKey, SubKey.

RegWriteのパラメータは、IniWriteのようにValueを最初に置くように並び替えました(ただし、Valueが唯一のパラメータだったシングルパラメータモードには影響しません)。

KeyNameが省略され、現在のループREGアイテムがサブキーである場合、RegDelete、RegRead、RegWriteはそのサブキー内の値に対して動作するようになりました。つまり、KeyNameのデフォルトはA_LoopRegKey "\" A_LoopRegNameです(A_LoopRegKeyはA_LoopRegSubKeyに統合されているので注意してください)。以前は以下のように振る舞っていました:

RegDelete、RegRead、RegWriteで、KeyNameが省略されている場合にValueNameを指定できるようになりました:

それ以外の場合、RegWrite、RegRead、A_LoopRegNameとの整合性のために、空白または省略されたValueNameを持つRegDeleteは、キーのデフォルト値(キー自体ではなく)を削除するようになりました。"AHK_DEFAULT" というフレーズは、もはや特別な意味を持ちません。キーを削除するには、RegDeleteKey(new)を使用します。

RegReadに、IniRead のようなDefaultパラメータが追加されました。

RegReadには、出力変数の後に値の種類を指定する、文書化されていない5パラメータモードがありました。これは削除されました。

スクリプトがstdinから読み込まれた場合、Reloadは何もしないようになりました。

Run and RunWait no longer recognize the UseErrorLevel option as ErrorLevel was removed. Use Try/Catch instead. A_LastError is set unconditionally, and can be inspected after an exception is caught/suppressed. RunWaitは、終了コードを返します。

Send(およびその亜種)は、ホットキーおよびクリックと一致する方法で{LButton}{RButton}を解釈するようになりました。つまり、ユーザーがシステム設定でボタンを入れ替えても、LButtonがプライマリボタン、RButtonがセカンダリボタンになります。

SendMessageと PostMessageでは、wParamとlParamが整数またはPtrプロパティを持つオブジェクトである必要があります。以前は、"で始まる式であればアドレスで文字列が渡されましたが、それ以外の文字列は整数に強制されていました。変数のアドレス(以前は&var、現在はStrPtr(var))を渡しても、変数の長さを更新しなくなりました(VarSetStrCapacity(&var, -1)を使用してください)。

SendMessageとPostMessageは、失敗(またはタイムアウト)時に例外を投げるようになり、ErrorLevelを設定しないようになりました。SendMessageは、メッセージの返信を返します。

SetTimerはラベル名や関数名をサポートしなくなりましたが、式が使えるようになり、関数は名前で直接参照できるようになったので、使い方は非常に似ています:SetTimer MyFunc. オブジェクトを受け取る他の関数と同様に、SetTimerもオブジェクトを返す式が使えるようになりました(以前は変数参照が必要でした)。

Sortは、以下の変更を受けました:

サウンド機能:SoundGetとSoundSetは、Vista+のサウンドAPIの機能によりマッチするように改訂され、XPのサポートを取りやめました。

StrGet:If Length is negative, its absolute value indicates the exact number of characters to convert, including any binary zeros that the string might contain - in other words, the result is always a string of exactly that length. Lengthが正の場合、変換後の文字列はv1のように最初の2進数ゼロで終了します。

StrGet/StrPut:The Address parameter can be an object with the Ptr and Size properties, such as the new Buffer object. The read/write is automatically limited by Size (which is in bytes). Lengthも指定された場合は、Size(UTF-16の場合は2倍)を超えてはいけません。

StrPut's return value is now in bytes, so it can be passed directly to Buffer().

StrReplaceでは、OutputVarCountの代わりにCaseSenseパラメータが追加され、パラメータが1つ右に移動し、Limitがそれに続いています。

Suspend:ホットキーやホットストリングの最初の行をSuspendの呼び出しにすることで、自動的にSuspendが免除されるようになることはなくなりました。代わりに、#SuspendExemptまたはSオプションを使用してください。"Permit" パラメータ値は無効となりました。

Switchは、デフォルトで文字列の大文字小文字を区別して比較するようになりました。また、大文字小文字を区別するモードを上書きし、(数値ではなく)文字列の比較を強制するCaseSenseパラメータがあります。以前はStringCaseSenseがOnに変更された場合のみ大文字と小文字を区別していました。

SysGetのサブコマンドは数値のみとなり、その他のサブコマンドは関数に分割されました。詳しくは後述の「サブコマンド」をご覧ください。

TrayTip's usage has changed to TrayTip [Text, Title, Options]. Options is a string of zero or more case-insensitive options delimited by a space or tab. The options are Iconx, Icon!, Iconi, Mute and/or any numeric value as before. TrayTip now shows even if Text is omitted (which is now harder to do by accident than in v1). The Timeout parameter no long exists (it had no effect on Windows Vista or later). スクリプトは、NIIF_USER (0x4) と NIIF_LARGE_ICON (0x20) フラグを組み合わせて (0x24) 使用し、トレイアイコンの大きいバージョンを通知に含めることができるようになります。NIIF_USER (0x4) は、小さなアイコンのために単独で使用することもできますが、すべてのOSで一貫した結果を得ることができない場合があります。

設定されていない変数を読み込むとエラーが発生するようになったため、#Warn UseUnsetLocal と UseUnsetGlobal は削除されました。IsSet can be used to avoid the error and Try/Catch or OnError can be used to handle it.

#Warn VarUnsetを追加しました。デフォルトは MsgBox です。無効化されていない場合、各変数への最初の非動的参照で、直接の非動的代入や参照演算子(&)の対象として使用されたり、IsSetに直接渡されたりすることがない場合に警告が表示されます。

#Warn Unreachable no longer considers lines following an Exit call to be unreachable, as Exit is now an ordinary function.

トップレベルのクラスが割り当てによって上書きされることがなくなったため、#Warn ClassOverwriteは削除されました。(ただし、ローカル変数によって暗黙的にシャドウされることができるようになりました。これは#Warn LocalSameAsGlobalで検出できます)。

WinActivateは、ウィンドウのアクティブ化に初めて失敗した後、{Alt up}を送信するようになりました。これにより、タスクバーのボタンが点滅する現象が軽減されることがテストで確認されています。詳しくはドキュメントをご覧ください。

WinClose and WinKill: For SecondsToWait, specifying 0 is no longer the same as specifying 0.5; instead, it produces the shortest wait possible.

WinSetTitleWinMoveは、他のWin関数と同じパラメータ順序を使用します。つまり、WinTitle、WinText、ExcludeTitle、ExcludeTextは、常に一緒に(パラメータリストの最後に)まとめられ、記憶に残りやすくなっています。

The WinTitle parameter of various functions can now accept a HWND (must be a pure integer) or an object with a Hwnd property, such as a Gui object. DetectHiddenWindows is ignored in such cases.

WinMoveでは、DEFAULTというリテラルワードに対する特別な処理を行わなくなりました。パラメータを省略するか、代わりに空文字列を指定します(v1、v2ともに有効です)。

WinWaitWinWaitCloseWinWaitActiveWinWaitNotActiveは、待ちが終了した場合(タイムアウトが終了しなかった場合)、非ゼロを返します。ErrorLevelを削除しました。WinWait、WinWaitActiveは、見つかったウィンドウのHWNDを返します。WinWaitClose now sets the Last Found Window, so if WinWaitClose times out, it returns 0 (false) and WinExist() returns the last window it found. For Timeout, specifying 0 is no longer the same as specifying 0.5; instead, it produces the shortest wait possible.

アンソートです:

InStrSubStrRegExMatchRegExReplaceの StartingPosが負の場合、末尾からの位置と解釈されます。位置-1が最後の文字で、位置0は無効です(v1では位置0が最後の文字でしたが)。

これまでOn/OffやOn/Off/Toggle(他の文字列は不可)を受け付けていた機能では、代わりに1/0/-1が必要となります。OnとOffは、通常、TrueFalseに置き換えられるでしょう。On/Offを返していた変数が1/0を返すようになり、式でより便利になりました。

以下の関数は、16進数文字列の代わりに純粋な整数を返します:

A_ScriptHwndも、純粋な整数を返します。

DllCall

型パラメータが変数である場合、その変数の内容が常に使用され、その名前は使用されます。つまり、引用符で囲まれていない型名はサポートされなくなり、型名は引用符で囲む必要があります。

DllCallがStrまたはWStrとして渡された変数の長さを更新するとき、文字列が適切にヌル終端されていないかどうかを検出し(バッファオーバーランが発生した可能性が高い)、安全な実行が保証されないため、エラーメッセージでプログラムを終了させるようにしました。

AStr(接尾辞なし)は入力専用になりました。バッファは入力文字列と同じ大きさしかないため、通常、出力パラメータには使えませんでした。AutoHotkeyがANSI用にコンパイルされている場合は、AStrではなくWStrに適用されますが、公式v2リリースはUnicode用にしかコンパイルされません。

関数がStr*AStr*、またはWStr*パラメータに新しいアドレスを書き込む場合、DllCallは、元の文字列の長さ(おそらく変更されていない)を単に更新するのではなく、対応する変数が提供されている場合は新しい文字列を代入するようになりました。このタイプのパラメータは、通常、入力文字列を変更するために使用されるのではなく、新しいアドレスで文字列を返すために使用されます。

DllCall now accepts an object for any Ptr parameter and the Function parameter; the object must have a Ptr property. For buffers allocated by the script, the new Buffer object is preferred over a variable. For Ptr*, the parameter's new value is assigned back to the object's Ptr property. This allows constructs such as DllCall(..., "Ptr*", unk := IUnknown()), which reduces repetition compared to DllCall(..., "Ptr*", punk), unk := IUnknown(punk), and can be used to ensure any output from the function is properly freed (even if an exception is thrown due to the HRESULT return type, although typically the function would not output a non-null pointer in that case).

DllCallでは、数値型パラメータの値が数値であることが要求されるようになり、数値以外または空文字列が与えられた場合は例外がスローされます。特に、出力パラメータに接尾辞として * または P を使用した場合、出力変数の初期化が必要となる。

スクリプトが数値を含むプレーンな変数を渡す場合、接尾辞に * または P を持つ数値パラメーターの出力値(もしあれば)は無視されます。To receive the output value, pass a VarRef such as &myVar or an object with a Ptr property.

新しいHRESULTの戻り値は、関数が失敗した場合(int < 0またはuint & 0x80000000)、例外をスローするものです。これは、実際にHRESULTを返す関数にのみ使用する必要があります。

ループサブコマンド

サブコマンドキーワードは文字どおり書かなければなりません。引用符で囲むことはできず、変数や式にすることはできません。その他のパラメータはすべて式です。All loop sub-commands now support OTB.

削除:

Loop, FilePattern [, IncludeFolders, Recurse]
Loop, RootKey [, Key, IncludeSubkeys, Recurse]

代わりに下記(v1.1.21で追加)を使用してください:

Loop Files, FilePattern [, Mode]
Loop Reg, KeyName [, Mode]

2語目以降のカンマは任意となりました。

A_LoopRegKeyにルートキーとサブキーが含まれるようになり、A_LoopRegSubKeyが削除されました。

InputBox

InputBoxObj := InputBox([Prompt, Title, Options, Default])

Optionsパラメータは、Guiのコントロールオプションと同様に、スペースまたはタブで区切られた0個以上の大文字と小文字を区別しないオプションの文字列を受け付けます。例えば、サポートされているすべてのオプションが含まれます:"x0 y0 w100 h100 T10.0 Password*". Tはタイムアウト、Passwordは同等のEditコントロールオプションと同じ使用法です。

幅と高さのオプションは、クライアント領域(タイトルバーとウィンドウフレームを除く領域)のサイズを設定するようになり、テーマへの依存度が低くなりました。

Titleパラメータが空文字列の場合、タイトルは空白となります。ユーザー定義関数のオプションパラメータと同様に、完全に省略された場合のみ、A_ScriptNameがデフォルトとなります。

InputBoxObj is an object with the properties Result (containing "OK", "Cancel" or "Timeout") and Value.

MsgBox

Result := MsgBox([Text, Title, Options])

Optionsパラメータは、Guiのコントロールオプションと同様に、スペースまたはタブで区切られた0個以上の大文字と小文字を区別しないオプションの文字列を受け付けます。

The return value is the English name of the button, without spaces. これらはv1のIfMsgBoxと同じ文字列です。

Titleパラメータが空文字列の場合、タイトルは空白となります。ユーザー定義関数のオプションパラメータと同様に、完全に省略された場合のみ、A_ScriptNameがデフォルトとなります。

Sub-Commands

Control、ControlGet、Drive、DriveGet、WinGet、WinSet、Processのサブコマンドは個別の機能に置き換えられ、メインコマンドは削除されました。一部の機能については、名称および使用方法を変更しています。新しい使い方は以下の通りです:

; Where ...は、オプションのControl、WinTitleなどを意味します。

Bool  := ControlGetChecked(...)
Bool  := ControlGetEnabled(...)
Bool  := ControlGetVisible(...)
Int   := ControlGetIndex(...)  ; For Tab, LB, CB, DDL
Str   := ControlGetChoice(...)
Arr   := ControlGetItems(...)
Int   := ControlGetStyle(...)
Int   := ControlGetExStyle(...)
Int   := ControlGetHwnd(...)

ControlSetChecked(TrueFalseToggle, ...)
         ControlSetEnabled(TrueFalseToggle, ...)
         ControlShow(...)
         ControlHide(...)
         ControlSetStyle(Value, ...)
         ControlSetExStyle(Value, ...)
         ControlShowDropDown(...)
         ControlHideDropDown(...)
         ControlChooseIndex(Index, ...)  ; Also covers Tab
Index := ControlChooseString(Str, ...)

Index := ControlFindItem(Str, ...)
Index := ControlAddItem(Str, ...)
         ControlDeleteItem(Index, ...)

Int   := EditGetLineCount(...)
Int   := EditGetCurrentLine(...)
Int   := EditGetCurrentCol(...)
Str   := EditGetLine(N [, ...])
Str   := EditGetSelectedText(...)
         EditPaste(Str, ...)

Str   := ListViewGetContent([Options, ...])

DriveEject([Drive])
         DriveRetract([Drive])
         DriveLock(Drive)
         DriveUnlock(Drive)
         DriveSetLabel(Drive [, Label])

Str   := DriveGetList([Type])
Str   := DriveGetFilesystem(Drive)
Str   := DriveGetLabel(Drive)
Str   := DriveGetSerial(Drive)
Str   := DriveGetType(Path)
Str   := DriveGetStatus(Path)
Str   := DriveGetStatusCD(Drive)
Int   := DriveGetCapacity(Path)
Int   := DriveGetSpaceFree(Path)

; Where ...は、オプションのWinTitleなどを意味します。

Int   := WinGetID(...)
Int   := WinGetIDLast(...)
Int   := WinGetPID(...)
Str   := WinGetProcessName(...)
Str   := WinGetProcessPath(...)
Int   := WinGetCount(...)
Arr   := WinGetList(...)
Int   := WinGetMinMax(...)
Arr   := WinGetControls(...)
Arr   := WinGetControlsHwnd(...)
Int   := WinGetTransparent(...)
Str   := WinGetTransColor(...)
Int   := WinGetStyle(...)
Int   := WinGetExStyle(...)

WinSetTransparent(N [, ...])
         WinSetTransColor("Color [N]" [, ...]),
         WinSetAlwaysOnTop([TrueFalseToggle := 1, ...])
         WinSetStyle(Value [, ...])
         WinSetExStyle(Value [, ...])
         WinSetEnabled(Value [, ...])
         WinSetRegion(Value [, ...])

WinRedraw(...)
         WinMoveBottom(...)
         WinMoveTop(...)

PID   := ProcessExist([PID_or_Name])
PID   := ProcessClose(PID_or_Name)
PID   := ProcessWait(PID_or_Name [, Timeout])
PID   := ProcessWaitClose(PID_or_Name [, Timeout])

ProcessSetPriority(Priority [, PID_or_Name])

ProcessExistProcessCloseProcessWaitProcessWaitCloseは、ErrorLevelを設定しなくなり、代わりにPIDを返すようになりました。

他のどの関数もErrorLevelを設定しません。その代わり、失敗すると例外を投げます。多くの場合、失敗の原因は対象となるウィンドウやコントロールが見つからなかったことにあります。

HWNDやスタイルは、16進数の文字列ではなく、常に純粋な整数値として返されます。

ControlChooseIndexは、0 で現在のアイテム/すべてのアイテムの選択を解除することができます。"Control Choose" に代わるもので、Tabコントロールにも対応しています。

"ControlGet Tab"はControlGetIndexに統合され、ListBox、ComboBox、DDLでも機能するようになりました。タブコントロールの場合、タブが選択されていない場合は0を返します(稀ですが有効です)。ControlChooseIndexは、アプリケーションで扱われない傾向があるため、タブコントロールの0を許可しない。

ControlGetItemsは、ListBoxとComboBoxの「ControlGet List」に代わるものです。Arrayを返します。

DriveEjectDriveRetractが mciSendString の代わりに DeviceIoControl を使用するようになりました。DriveEjectは、エクスプローラーに「取り出し」オプションがあるCD/DVD以外のドライブ(リムーバブルドライブ、固定ディスクとして表示される外付けハードディスクは除く)を取り出すことができます。

ListViewGetContentは、ListViewの「ControlGet List」に代わるもので、現在は従来と同じ使い方ができます。

WinGetListWinGetControlsWinGetControlsHwndは、改行で区切られたリストではなく、配列を返します。

WinSetTransparentは、""0ではなく "Offとして扱います(ウィンドウが見えなくなり、クリックできなくなります)。

Topmost、Trans、FS、Capなどの省略された別名を削除しました。

以下の関数は、以前はSysGetのサブコマンドでした:

ActualN := MonitorGet([N, &Left, &Top, &Right, &Bottom])
ActualN := MonitorGetWorkArea([N, &Left, &Top, &Right, &Bottom])
Count   := MonitorGetCount()
Primary := MonitorGetPrimary()
Name    := MonitorGetName([N])

新機能のご紹介

Buffer([ByteCount, FillByte]) (calling the Buffer class) creates and returns a Buffer object encapsulating a block of memory with a size of ByteCount bytes, initialized only if FillByte is specified. BufferObj.Ptrはアドレスを返し、BufferObj.Sizeはバイト単位のサイズを返すか設定します(メモリブロックの再割り当て)。Any object with Ptr and Size properties can be passed to NumPut, NumGet, StrPut, StrGet, File.RawRead, File.RawWrite and FileAppend. Any object with a Ptr property can be passed to DllCall parameters with Ptr type, SendMessage and PostMessage.

CaretGetPos([&OutputVarX, &OutputVarY]) retrieves the current coordinates of the caret (text insertion point). これにより、XとYの座標が常に一致し、予期せぬ動作(A_CaretX/Yが現在のCoordModeにない値を返すなど)を引き起こすキャッシュがないことが保証されます。

ClipboardAll([Data, Size])は、クリップボード上のすべてのデータを含むオブジェクトを作成します(オプションとして、クリップボードの現在の内容を使用する代わりに、以前にクリップボードから取得したデータを受け入れることができます)。クリップボードファイルのデータを読み込む方法と書き込む方法は異なります。データ形式は同じですが、データサイズが常に32ビットであるため、32ビットと64ビットのビルド間でデータを移植することができます。詳しくはv2のドキュメントをご覧ください。

ComCall(offset, comobj, ...) is equivalent to DllCall(NumGet(NumGet(comobj.ptr) + offset * A_Index), "ptr", comobj.ptr, ...), but with the return type defaulting to HRESULT rather than Int.

ComObject(旧ComObjCreate)とComObjQueryは、IIDが指定されていても、ラッパーオブジェクトを返すようになりました。ComObjQuery permits the first parameter to be any object with a Ptr property.

ControlGetClassNNは、指定されたコントロールの ClassNN を返します。

ControlSendText, equivalent to ControlSendRaw but using Text mode instead of Raw mode.

DirExist(FilePattern), with usage similar to FileExist. Note that a wildcard check like InStr(FileExist("MyFolder\*"), "D") with MyFolder containing files and subfolders will only tell you whether the first matching file is a folder, not whether a folder exists.

Float(Value):上記のさらに上の「タイプ」を参照してください。

InstallKeybdHook([Install, Force]) and InstallMouseHook([Install, Force]) replace the corresponding directives, for increased flexibility.

Integer(Value):上記のさらに上の「タイプ」を参照してください。

IsXXX: The legacy command "if Var is Type" has been replaced with a series of functions: IsAlnum, IsAlpha, IsDigit, IsFloat, IsInteger, IsLower, IsNumber, IsSpace, IsUpper, IsXDigit. With the exception of IsFloat, IsInteger and IsNumber, an exception is thrown if the parameter is not a string, as implicit conversion to string may cause counter-intuitive results.

IsSet(Var), IsSetRef(&Ref): Returns 1 (true) if the variable has been assigned a value (even if that value is an empty string), otherwise 0 (false). If 0 (false), attempting to read the variable within an expression would throw an error.

Menu()/MenuBar()は、v1 Menu サブコマンドに対応する以下のメンバを持つ新しい Menu/MenuBar オブジェクトを返します。Methods:Add, AddStandard, Check, Delete, Disable, Enable, Insert, Rename, SetColor, SetIcon, Show, ToggleCheck, ToggleEnable, Uncheck. プロパティー:ClickCountDefaultHandle(MenuGetHandleを置き換えたもの)。A_TrayMenuは、Menu オブジェクトも返します。UseErrorLevelモード、グローバルメニュー名、メニュー自体の明示的な削除はありません(すべての参照が解放されたときに起こります;Deleteメソッドはv1 DeleteAllと同等です)。ラベルはサポートされておらず、ファンクションオブジェクトのみです。AddStandardメソッドは、標準的なメニュー項目を追加し、カスタム項目と同様に個別に変更することができます。v1とは異なり、Win32メニューはオブジェクトが削除されたときのみ破棄されます。

MenuFromHandle(Handle) retrieves the Menu or MenuBar object corresponding to a Win32 menu handle, if it was created by AutoHotkey.

Number(Value):上記のさらに上の「タイプ」を参照してください。

Persistent([Persist]) replaces the corresponding directive, increasing flexibility.

RegDeleteKey([KeyName]) deletes a registry key. (RegDeleteは、レジストリループですべてのパラメータを省略する場合を除き、値のみを削除するようになりました)。

SendText, equivalent to SendRaw but using Text mode instead of Raw mode.

StrCompare(String1, String2 [, CaseSense]) returns -1 (String1 is less than String2), 0 (equal) or 1 (greater than). CaseSenseは"Locale"にすることができます。

String(Value):上記のさらに上の「タイプ」を参照してください。

StrPtr(Value) returns the address of a string. v1のaddress-ofとは異なり、リテラル文字列と一時的な文字列で使用することができます。

SysGetIPAddresses()は、削除されたA_IPAddress変数に相当するIPアドレスの配列を返すものです。A_IPAddress%N%を参照するたびに、すべてのアドレスを検索しますが、1つしか返さないため、複数のアドレスを検索すると、必要以上に指数関数的に時間がかかります。返された配列は、0個以上の要素を持つことができます。

TraySetIcon([FileName、IconNumber、Freeze])は、"Menu Tray, Icon"を置き換えます。

VarSetStrCapacity(&TargetVar [, RequestedCapacity]) replaces the v1 VarSetCapacity, but is intended for use only with UTF-16 strings (such as to optimize repeated concatenation); therefore RequestedCapacity and the return value are in characters, not bytes.

VerCompare(A, B)は、#Requiresと同じアルゴリズムで2つのバージョン文字列を比較します。

WinGetClientPos([&OutX, &OutY, &OutWidth, &OutHeight, WinTitle, ...]) retrieves the position and size of the window's client area, in screen coordinates.

新しいディレクティブ

#DllLoad [FileOrDirName]:スクリプトの実行を開始する前に、DLLまたはEXEファイルをロードします。

組み込みの変数

A_AhkPathは、スクリプトがコンパイルされている場合でも、常に現在の実行ファイル/インタプリタのパスを返します。以前は、ベースファイルとしてBINファイルを使用した場合、コンパイルされたスクリプトのパスを返していましたが、v2.0リリースではBINファイルを含まないようになりました。

A_IsCompiledは、スクリプトがコンパイルされていない場合、""の代わりに0を返します。

A_OSVersionは常にmajor.minor.buildという形式の文字列を返し、例えば Windows 7 SP1 では6.1.7601となります。A_OSTypeは、NT系のみ対応しているため、削除されました。

A_PriorHotkeyが""の場合、A_TimeSincePriorHotkeyは-1ではなく""を返し、A_ThisHotkeyが空白の場合も同様にA_TimeSinceThisHotkeyは-1を返します。

すべての組み込み「仮想」変数の接頭辞がA_になりました(詳細は下記)。この接頭辞がない定義済み変数(Objectなど)は、単なるグローバル変数です。現在、仮想変数への参照は(組み込み関数に直接渡される場合を除き)不可能であるため、この区別は重要でしょう。

数値を返す組み込み変数が、文字列ではなく、整数で返すようになりました。

改名:

削除:

追加:

以下の組み込み変数に値を割り当てることができます:

組込オブジェクト

File objects now strictly require property syntax when invoking properties and method syntax when invoking methods. For example, FileObj.Pos(n) is not valid. パラメータが少なすぎたり多すぎたりした場合や、読み取り専用のプロパティに値が割り当てられた場合は、例外が発生します。

File.Tell() was removed.

Func.IsByRef() now works with built-in functions.

Gui

Gui、GuiControl、GuiControlGetは、Gui()Gui/GuiControlオブジェクトに置き換えられ、一般により柔軟で一貫性があり、より使いやすくなりました。

GUIは通常、名前/番号で参照されません(ただし、GuiObj.Nameで名前を付けることはできます)。その代わり、GUIオブジェクト(とウィンドウ)は、GuiObj := Gui()のようにGuiクラスをインスタンス化することで明示的に作成します。このオブジェクトは、Guiのサブコマンドを置き換えるメソッドとプロパティを持ちます。Gui.Add() returns a GuiControl object, which has methods and properties which replace the GuiControl and GuiControlGet commands. One can store this object in a variable, or use GuiObj["Name"] or GuiCtrlFromHwnd to retrieve the object. また、イベントハンドラ(g-labelの置き換え)が呼ばれるたびに、パラメータとして渡されます。

これらのメソッドやプロパティの使い方は、1:1 ではありません。より一貫性のある、より柔軟性のあるものにするため、また、バグや制限を修正するために、多くの部分が改訂されています。

ターゲットとなるGUIやコントロールオブジェクトは常に指定されるため、「デフォルト」のGUIは存在しない。LV/TV/SBの関数が(コントロールオブジェクトの)メソッドに置き換えられ、複数のListView/TreeViewの利用がより容易になりました。

イベントに関する情報を含む組み込み変数はありません。これらの情報は、ソースGUIやコントロールを含む、イベントを処理する関数/メソッドにパラメータとして渡されます。

Controls can still be named and be referenced by name, but it's just a name (used with GuiObj["Name"] and Gui.Submit()), not an associated variable, so there is no need to declare or create a global or static variable. The value is never stored in a variable automatically, but is accessible via GuiControl.Value. Gui.Submit() returns a new associative array using the control names as keys.

The vName option now just sets the control's name to Name.

The +HwndVarName option has been removed in favour of GuiControl.Hwnd.

GUIイベントを自動的に処理する "g-labels"やラベル/ファンクションはもう存在しません。スクリプトは、GuiまたはGuiControlのOnEventメソッドを呼び出して、関心のある各イベントに登録する必要があります。For example, rather than checking if (A_GuiEvent = "I" && InStr(ErrorLevel, "F", true)) in a g-label, the script would register a handler for the ItemFocus event:MyLV.OnEvent("ItemFocus", MyFunction). MyFunctionは、ItemFocusイベントに対してのみ呼び出されることになります。It is not necessary to apply the AltSubmit option to enable additional events.

配列は、リストボックスの作成時、項目の追加時、選択された項目の取得時など、これまでパイプで区切られたリストが使われていた場所に使用されます。

スクリプトは、GUIを拡張し、独自のイベントを処理するクラスを定義することができ、すべてのGUIロジックを自己完結させることができます。

Guiサブコマンド

Gui NewGui(). 空のタイトルを渡すと(省略せずに)、デフォルトのタイトルではなく、空のタイトルが表示されるようになりました。

Gui AddGui.Add() or Gui.AddControlType(); e.g. GuiObj.Add("Edit") or GuiObj.AddEdit().

Gui ShowGui.Show(), but it has no Title parameter. The title can be specified as a parameter of Gui() or via the Gui.Title property. ただし、ボタンコントロールの場合は、デフォルトのボタンにフォーカスが移動します。

Gui SubmitGui.Submit(). Submit()がすべての「関連変数」を含む新しいオブジェクトを作成し、返すことを除けば、以前と同じように動作します。

Gui DestroyGui.Destroy(). オブジェクトはまだ(スクリプトがそれを解放するまで)存在しますが、使用することはできません。新しいGUIを作成する必要があります(必要な場合)。オブジェクトが削除されるとウィンドウも破壊されますが、ウィンドウが表示されている間はオブジェクトが「生かされる」のです。

Gui FontGui.SetFont(). It is also possible to set a control's font directly, with GuiControl.SetFont().

Gui ColorGui.BackColor sets/returns the background color. ControlColor(第2パラメータ)はサポートされていませんが、以前サポートしていたすべてのコントロールは、代わりに+Backgroundオプションで背景を設定することができます。Unlike "Gui Color", Gui.BackColor does not affect Progress controls or disabled/read-only Edit, DDL, ComboBox or TreeView (with -Theme) controls.

Gui MarginGui.MarginX and Gui.MarginY properties.

Gui MenuGui.MenuBar sets/returns a MenuBar object created with MenuBar().

Gui Cancel/Hide/Minimize/Maximize/Restore → 同名のGuiメソッド。

Gui FlashGui.Flash(), but use false instead of Off.

Gui TabGuiControl.UseTab(). デフォルトは、従来通りタブ名のプレフィックスと一致します。第2パラメータにtrueを渡すと、タブ名全体にマッチしますが、v1の「Exact」モードとは異なり、大文字と小文字は区別されません。

イベント情報

明示的にサポートされるすべてのGUIおよびGUI制御イベントの詳細については、イベント(OnEvent)を参照してください。

Sizeイベントは、0、1、2の代わりに、0、-1、1(WinGetMinMaxと一致)を渡します。

ContextMenuイベントは、コントロールごとに、またはGUI全体に対して登録することができます。

DropFilesイベントは、ContextMenuと整合性を取るために、FileArrayCtrlパラメータを入れ替えました。

ContextMenuとDropFilesイベントは、ウィンドウ座標の代わりにクライアント座標を使用します(Clientはv2のデフォルトCoordModeでもあります)。

The following control events were removed, but detecting them is a simple case of passing the appropriate numeric notification code (defined in the Windows SDK) to GuiControl.OnNotify():K、D、d、A、S、s、M、C、E、および、MonthCalの1、2です。

制御イベントは、イベント名をパラメータとして渡すことはありません(GUIイベントは、そのようなことはありません)。

Custom's N and Normal events were replaced with GuiControl.OnNotify() and GuiControl.OnCommand(), which can be used with any control.

リンクのClickイベントは、「Ctrl, Index, HREF or ID」ではなく「Ctrl, ID or Index, HREF」を渡し、Clickコールバックが登録されている場合は、自動的にHREFを実行しないようにしました。

ListViewのClick、DoubleClick、ContextMenu(右クリックでトリガーされる場合)イベントで、フォーカスされたアイテムではなく、クリックされたアイテム(ない場合は0)を報告するようになりました。

ListViewのIイベントは、F(ItemFocus)が暗示するため除外されたf(de-focus)イベントを除き、複数の名前のついたイベントに分割されました。

ListViewのe(ItemEdit)イベントは、ユーザーがキャンセルした場合、無視されます。

スライダーの Change イベントは、v1 g-label よりも一貫して発生します。つまり、デフォルトでマウスホイールによる変更を無視することはなくなります。詳しくは「変化の検出(スライダー)」をご覧ください。

ボタン、チェックボックス、ラジオコントロールで、必要に応じてBS_NOTIFYスタイルが自動的に追加されるようになりました。ラジオコントロールにはデフォルトで適用されなくなりました。

Focus(旧F)およびLoseFocus(旧f)は、より多くの(しかしすべてではない)コントロールタイプでサポートされています。

EditコントロールのテキストをEdit.ValueまたはEdit.Textで設定しても、コントロールのChangeイベントは発生しませんが、GuiControlではコントロールのg-labelは発生します。

LV/TV.Add/Modifyはアイテムチェンジイベントを抑制するようになりましたので、そのようなイベントはユーザーアクションまたはSendMessageによってのみ発生します。

削除

+Delimiter
+HwndOutputVar (use Gui.Hwnd or GuiControl.Hwnd instead)
+Label
+LastFoundExist
Gui GuiName:デフォルト

Control Options

+/-Background は、解釈とサポートがより一貫しています。ListView/TreeView/StatusBar/Progressだけでなく、"Gui Color" をサポートしていたすべてのコントロールが+BackgroundColor+BackgroundDefault-Backgroundと同義)をサポートしました。

Gui.Add() defaults to y+m/x+m instead of yp/xp when xp/yp or xp+0/yp+0 is used. つまり、コントロールは全く同じ位置ではなく、前のコントロールの下/右側に配置されます。オフセットが0でない場合は、v1と同じ動作となります。全く同じ位置を使用する場合は、xp ypを一緒に指定してください。

x+my+mの後に、x+m+10x+m10も有効だが、可読性が低い)のような付加的なオフセットを付けることができます。

Chooseは、もはやMonthCalの値を指定する冗長な(文書化されていない)方法として機能しません。前回同様、Textパラメータを使用するだけです。

GuiControlGet

空のサブコマンド

GuiControlGetの空サブコマンドには2つのモードがありました:というデフォルトのモードと、4番目のパラメータがTextという単語であるテキストモードがあります。コントロールタイプに単一の「値」がない場合、GuiControlGetはGetWindowTextの結果を返すのがデフォルトでした(これは必ずしも可視テキストではありません)。コントロールによっては、テキストが表示されていなかったり、テキストの取得をサポートしていなかったりするため、4番目のパラメータを完全に無視することができました。By contrast, GuiControl.Text returns display text, hidden text (the same text returned by ControlGetText) or nothing at all.

下の表は、GuiControlGetの各モードとコントロールタイプに最も近い同等のプロパティまたは関数を示しています。

ControlデフォルトTextNotes
ActiveX.Value.Textテキストは非表示です。下記をご覧ください。
Button.Text
CheckBox.Value.Text
ComboBox.TextControlGetText()AltSubmitが使用された場合、Textの代わりにValueを使用する(ただし、Textがリスト項目に一致しない場合、Valueは0を返します)。Textは大文字・小文字の訂正を行い、ControlGetTextはEditフィールドの内容を返します。
Custom.Text
DateTime.Value
DDL.TextAltSubmitが使用されていた場合、Textの代わりにValueを使用します。
Edit.Value
GroupBox.Text
Hotkey.Value
Link.Text
ListBox.TextControlGetText()AltSubmitが使用されていた場合、Textの代わりにValueを使用します。Textは選択された項目のテキストを返し、ControlGetTextは非表示のテキストを返します。下記をご覧ください。
ListView.Textテキストは非表示です。
MonthCal.Value
画像.Value
Progress.Value
Radio.Value.Text
Slider.Value
StatusBar.Text
Tab.TextControlGetText()AltSubmitが使用されていた場合、Textの代わりにValueを使用します。Textは選択されたタブのテキストを返し、ControlGetTextは非表示のテキストを返します。
Text.Text
TreeView.Textテキストは非表示です。
UpDown.Value

ListBox:複数選択可能なListBoxの場合、TextとValueはパイプで区切られたリストではなく、配列で返されます。

ActiveX:GuiControl.Value returns the same object each time, whereas GuiControlGet created a new wrapper object each time. その結果、ComObjConnectの接続を維持するためにActiveXオブジェクトへの参照を保持する必要がなくなりました。

その他のサブコマンド

PosGuiControl.GetPos()

FocusGui.FocusedCtrl; returns a GuiControl object instead of the ClassNN.

FocusVGuiObj.FocusedCtrl.Name

HwndGuiControl.Hwnd; returns a pure integer, not a hexadecimal string.

Enabled/Visible/Name→同名のGuiCtrlプロパティ。

GuiControl

(ブランク)およびテキストサブコマンド

The table below shows the closest equivalent property or method for each mode of GuiControl and control type.

Control(Blank)TextNotes
ActiveXN/Aコマンドは何の効果もありませんでした。
Button.Text
CheckBox.Value.Text
ComboBox.Delete/Add/Choose.Text
Custom.Text
DateTime.Value.SetFormat()
DDL.Delete/Add/Choose
Edit.Value
GroupBox.Text
Hotkey.Value
Link.Text
ListBox.Delete/Add/Choose
ListViewN/Aコマンドは何の効果もありませんでした。
MonthCal.Value
画像.Value
Progress.Value接頭辞+の代わりに+=演算子を使用します。
Radio.Value.Text
Slider.Value接頭辞+の代わりに+=演算子を使用します。
StatusBar.TextまたはSB.SetText()
Tab.Delete/Add/Choose
Text.Text
TreeViewN/Aコマンドは何の効果もありませんでした。
UpDown.Value接頭辞+の代わりに+=演算子を使用します。

その他のサブコマンド

MoveGuiControl.Move()

MoveDraw → GuiControl.Move(), GuiControl.Redraw()

FocusGuiControl.Focus(), which now uses WM_NEXTDLGCTL instead of SetFocus, so that focusing a Button temporarily sets it as the default, consistent with tabbing to the control.

Enable/Disable → set GuiControl.Enabled

Hide/Show → set GuiControl.Visible

ChooseGuiControl.Choose(n), where n is a pure integer. The |n or ||n mode is not supported (use ControlChooseIndex instead, if needed).

ChooseStringGuiControl.Choose(s), where s is not a pure integer. The |n or ||n mode is not supported (use ControlChooseString instead, if needed). If the string matches multiple items in a multi-select ListBox, this method selects them all, not just the first.

FontGuiControl.SetFont()

+/-OptionGuiControl.Opt("+/-Option")

その他の変更点

Progress Guiコントロールは、デフォルトでPBS_SMOOTHスタイルを持たなくなり、システムのビジュアルスタイルに従ってスタイリングされるようになりました。

The default margins and control sizes (particularly for Button controls) may differ slightly from v1 when DPI is greater than 100 %.

GuiCtrl.Value:="new_image.png"で新しい画像の設定に失敗しても、ピクチャーコントロールが現在の画像を削除しないようになりました。ただし、GuiCtrl.Value := ""で現在の画像を削除することは可能です。

ListView.InsertCol()'s ColumnNumber parameter can now be omitted, which has the same effect as specifying a column number larger than the number of columns currently in the control.

エラー処理

重大なエラーが発生した場合、スクリプトを終了する前にOnErrorが呼び出されるようになりました。スクリプトが実行可能な状態でない可能性がありますが、OnExitと同様に実行を試みます。

ランタイムエラーで、Exception.Whatを現在実行中のユーザー定義関数またはサブに設定しなくなりました(ただし、Error()を第2パラメータなしで呼び出すと、この設定は行われます)。これにより、Whatは、より明確な目的を持つことができます:関数名の場合は、その関数の失敗を示します(関数の呼び出しやパラメータの評価に失敗したわけではありません)。式の評価や制御フローのエラーで空白になるもの(その他にも空白になるものがあります)。

ランタイムエラーが投げる例外オブジェクトは、新しいErrorクラスまたはより具体的なサブクラスのインスタンスとして識別できるようになりました。Error objects have a Stack property containing a stack trace. Whatパラメータで実行中の関数名を指定した場合、FileLineは、どの行からその関数が呼び出されたかに基づいて設定されるようになりました。

Try-catchの構文が変更され、スクリプトが特定のエラークラスをキャッチし、他のエラークラスをキャッチしないようにすることができるようになりました。詳しくは下記のCatchをご覧ください。

継続可能なエラー

ほとんどの場合、エラーダイアログは、現在のスレッドを継続する(スレッドを終了する)オプションを提供するようになりました。COMエラーが発生した場合、続行しないことを選択するとスレッドが終了するようになりました(スクリプト全体が終了するのではありません)。

スクリプトはこれに依存しないようにしてください:エラーが組み込み関数によって発生した場合、その関数を継続すると""が返されます。式評価器でエラーが発生した場合(無効な動的参照やゼロ除算など)、式は中断され、""(制御フロー文のパラメータとして使用された場合)が出力されます。

コードが継続をサポートしていないケースもあり、継続の選択肢は表示しない方がよいでしょう。また、スクリプトを終了させるためのクリティカルエラーの場合は、このオプションは表示されません。

OnErrorコールバックは、以下の値のいずれかを含む第2パラメータを取るようになりました:

ErrorLevel

ErrorLevelは削除されました。スクリプトはエラーチェックをせずに書かれることが多いので(おそらく通常)、エラーにErrorLevelを設定する方針では、エラーが検出されないことがよくあります。すぐにエラーメッセージが表示されるのは、少し対立的に見えるかもしれませんが、一般的にはより有用です。

ErrorLevelがエラー状態を示すために設定されていた場合、代わりに例外がスローされ、(通常)より有益なエラーメッセージが表示されます。

"Process Exist"などのコマンドで値を返していたものが、単にその値を返す(例:pid := ProcessExist())か、もっと便利なもの(例:hwnd := GroupActivate(group))になりました。

ErrorLevelが二次的な戻り値として使用されるケースもあった。

File functions which previously stored the number of failures in ErrorLevel now throw it in the Extra property of the thrown exception object.

SendMessage timeout is usually an anomolous condition, so causes a TimeoutError to be thrown. TargetError and OSError may be thrown under other conditions.

The UseErrorLevel modes of the Run and Hotkey functions were removed. This mode predates the addition of Try/Catch to the language. MenuとGuiにもこのモードがありましたが、オブジェクト(ErrorLevelを使用しない)に変更されました。

など、v1よりも多くのシンタックスエラーに対してロードタイムエラーが発生します:

以下のいずれかの失敗が発生した場合、例外が発生します(失敗を無視したり、空文字列を生成するのではありません):

上記の条件の中には、v1では検出されるが、表現の途中では検出されないものがある。例えば、A_AhkPath := xは、v1で検出されるが、y := x, A_AhkPath := xは、v2でのみ検出されます。

演算子+=,-=,--,++を単独で使用しても、空の変数を 0 として扱わなくなりました。これは、v1とは異なり、空の変数を単独で使用した場合は0として扱い、式の途中や複数文のカンマを使用した場合は0として扱わないというものです。

関数

関数は一般に、失敗すると例外を投げます。特に:

以前は検出されなかったいくつかのエラーに対して例外がスローされ、(以前はErrorLevelの設定によって)誤ってエラーとしてマークされていたいくつかの条件が修正されました。

一部のエラーメッセージが変更されました。

Catch

Catchの構文が変更され、特定のエラークラスをキャッチする一方、他のエラークラスはキャッチしない(コールスタックのさらに上の別のCatchに制御を移す、またはエラーを報告してスレッドを終了する)方法が提供されました。これまでは、すべての型のスローされた値をキャッチし、型をチェックして再スローする必要がありました。事例:

; Old (v1には `is` や Error クラスがないため、古い v2.0-a のルールを使ってデモを行う)
try
    SendMessage msg,,, "Control1", "The Window"
catch err
    if err is TimeoutError
        MsgBox "The Window is unresponsive"
    else
        throw err

; New
try
    SendMessage msg,,, "Control1", "The Window"
catch TimeoutError
    MsgBox "The Window is unresponsive"

Variations:

If Try is used without Finally or Catch, it acts as though it has a Catch with an empty block. Although that sounds like v1, now Catch on its own only catches instances of Error. In most cases, Try on its own is meant to suppress an Error, so no change needs to be made. However, the direct v2 equivalent of v1's try something() is the following:

try something()
catch Any
{}

出力変数名よりもエラーの種類を優先することで、より良いコードを作ることができるかもしれません。期待されるエラーを意図通りに処理し、報告されるべき予期せぬエラーを抑制したり誤処理したりすることはありません。

すべての型の値が投げられるので、どのようなクラスでもフィルターとして有効です(例:StringMap)。ただし、クラスプロトタイプはロード時に解決されるため、任意の式ではなく完全なクラス名で指定する必要があります(class x extends yyと同様)。

While a Catch statement is executing, throw (without parameters) can be used to re-throw the exception (avoiding the need to specify an output variable just for that purpose). これはネストされたTry-Finally内でもサポートされるが、ネストされたTry-Catch内ではサポートされない。The throw does not need to be physically contained by the Catch statement's body; it can be used by a called function.

An Else can be present after the last Catch; this is executed if no exception is thrown within Try.

キーボード、マウス、ホットキー、ホットストリング

VKからSC、SCからVKへのマッピングがハードコードされることが少なくなり、理論上、従来とは異なるカスタムキーボードレイアウトとの互換性が向上しています。

キー名「Return」「Break」を削除しました。代わりに「Enter」「Pause」を使ってください。

キーボードレイアウトDLLからKLLF_ALTGRフラグを読み取ることで、各キーボードレイアウトにAltGrがあるかどうかを常に検出するようにしました。(v1.1.28+のUnicodeビルドでは既にこの方法が使われています。) キーボードフックでAltGrを検出するフォールバックメソッドは削除されました。

マウスホイールのホットキーで、A_EventInfoを120で割るのではなく、マウスドライバーから報告されたホイールデルタに設定します。一般的には120の倍数ですが、マウスのハードウェア/ドライバによっては、より高い解像度でホイールの動きを報告する場合があります。

ホットストリングで、Shift+BackspaceBackspaceと同じように扱い、ホットストリングバッファ内で`bに転写するようになりました。

ホットストリングは、複数のコロンの組が存在する場合、最後の組ではなく、最初の組のコロン(::)を区切り文字として使用します。つまり、コロン(他のコロンに隣接する場合)は、v2ではトリガーテキストでエスケープする必要がありますが、v1では置換でエスケープする必要があります。なお、コロンが奇数個連続する場合、以前の動作では最後のコロンがペアの一部とみなされませんでした。例えば、::1:::21:2 )では動作に変化はありませんが、::3::::43::4 となるのではなく、 3::4 となっています。

ホットストリングは、ペアでコロンをエスケープすることはなくなりました。つまり、ホットストリングトリガーの最後に1つのコロンをエスケープすることが可能になりました。例えば、::5`:::6はエラーではなく5:6 となり、::7`::::87::8 よりも 7::8 となっています。このような場合、混乱を避けるために、リテラルなコロンをすべてエスケープするのが最善です(ただし、孤立した1つのコロンはエスケープする必要はありません)。

継続セクションを持つホットストリングのデフォルトが、RawモードではなくTextモードになりました。

ホットキーが論理的に下にあり、ホットキーがWin/Altキーを必要とする場合のみ、リリース時にWin/Altキーをマスクするようになりました(#/!またはカスタム接頭辞付き)。つまり、Win/Altキーを必要としないホットキーは、Win/Altキーが物理的にダウンしているときにWin/Altアップをマスクすることはなくなりました。これにより、{Blind}{LWin up}を送信するホットキーでスタートメニューを起動できるようになりました(AppsKey::RWinなどのリマップキーを使用すれば、すでに可能でした)。

Other

Windows 2000とWindows XPのサポートは終了しました。

AutoHotkeyは、起動時にシステムのForegroundLockTimeout設定を上書きしなくなりました。

RegEx の改行マッチングのデフォルトは (*ANYCRLF) と (*BSR_ANYCRLF) で、`r`n に加えて `r と `n が認識されます。`a オプションは暗黙のうちに(*BSR_UNICODE)を有効にします。

RegExのコールアウト関数が可変になりました。pcre_callout変数を介して指定されたコールアウトは、任意の呼び出し可能なオブジェクトであることができ、またはpcre_callout自体は、関数(おそらく入れ子関数)として直接定義することができます。関数と変数の名前空間が統合されたため、(?C:fn)のような呼び出しパターンは、ユーザー定義関数だけでなく、関数オブジェクトを含むローカル変数やグローバル変数も参照することができます。

標準入力から読み込まれるスクリプト(例:AutoHotkey.exe *)は、A_ScriptFullPathやメインウィンドウのタイトルに初期作業ディレクトリを含めなくなりましたが、A_ScriptDirとして、またローカルLibフォルダを探すために使用されます。

Settings changed by the auto-execute thread now become the default settings immediately (for threads launched after that point), rather than after 100 ms and then again when the auto-execute thread finishes.

ダイナミックアロケーションを活用することで、以下の制限を解除しました:

ListVarsで、静的変数とローカル変数を分けて表示するようにしました。関数内で宣言されたグローバル変数も静的変数としてリストアップされます(これは新しい実装の詳細による副作用ですが、多くのグローバル変数を持つスクリプトで役に立つかもしれないので残してあります)。

コードサイズとメンテナンスコストを削減するために、(文書化されていない?) "lazy var" 最適化が削除されました。この最適化により、100,000以上の変数を持つスクリプトのパフォーマンスが改善されました。

トレイメニュー:「スクリプトの一時停止」やメインウィンドウのメニューオプションとの整合性をとるため、「このスクリプトを再読み込み」「このスクリプトを編集」から「この」という単語を削除しました。

YYYYMMDDHH24MISSタイムスタンプ値の長さが4~14の偶数でない場合、無効と判断されるようになりました(包括的)。

永続性

スクリプトは、以下の条件のうち少なくとも1つが満たされている間、「永続的」です:

以下のいずれかが発生し、上記の条件が満たされない場合、スクリプトは終了します。

柔軟性を持たせるため、OnMessageはスクリプトを自動的に永続化させません。

これに対し、v1スクリプトは、以下のうち少なくとも1つが成立する場合に「永続的」であるとします:

スレッド

Threads start out with an uninterruptible timeout of 17 ms instead of 15 ms. システムのティックカウントは最小15または16のステップで更新されるため、15は低すぎます。つまり、ティックカウントが正確に間違ったタイミングで更新されると、実質的に時間が経過していないにもかかわらず、スレッドが中断される可能性があります。

スレッドが中断されずにスタートした場合、中断されないタイムアウトが先に切れても、少なくとも1行が実行されるまで中断されないようになりました(例えば、スレッドがスタートした直後に、他のプロセスにCPU時間を与えるために、システムがプロセスを中断した場合)。

#MaxThreads#MaxThreadsPerHotkeyは、最初の行が以下の関数のいずれかであるサブルーチンの例外を作らないようになりました:ExitApp, Pause, Edit, Reload, KeyHistory, ListLines, ListVars, または ListHotkeys.

デフォルトの設定

デフォルトのスクリプト

When an AutoHotkey program file (such as AutoHotkey32.exe or AutoHotkey64.exe) is launched without specifying a script file, it no longer searches the user's Documents folder for a default script file.

AutoHotkey is not intended to be used by directly launching the program file, except when using a portable copy. Instead of running the program file, you should generally run an .ahk file.

If you are creating a shortcut to a specific program file, you can append a space and the path of a script (generally enclosed by quote marks) to the shortcut's target.

コマンドライン

コマンドラインの引数は、番号付きグローバル変数の擬似配列に格納されなくなりました。代わりにグローバル変数A_Args(v1.1.27で追加)を使用する必要があります。

Rと/Fのスイッチは削除されました。代わりに/restartと/forceを使用してください。

関数ライブラリの自動インクルード機構が削除されたため、AutoHotkey.exeを使用してスクリプトの構文エラーをチェックする場合、/iLibの代わりに/validateを使用する必要があります。

以下のいずれかの場合、/ErrorStdOut は組み込みではなく、スクリプトのパラメータの1つとして扱われるようになりました: