リテラルの割り当てが廃止されました:var = value
従来のIf文がすべて廃止され、if expression
のみを残し、括弧を必要としません(ただし、あらゆる式と同様に括弧を使用できる)ようにしました。
"command syntax"の廃止。コマンドは存在せず、ただ 関数呼び出し文があります。これは、括弧のない単なる関数やメソッドの呼び出しです。これは、以下を意味します:
WinMove(, y)
= WinMove , y
のようになります。わかりやすくするために、スペースまたはタブが必要です。一貫性を保つため、ディレクティブも新しい規約に従っています(ディレクティブ名とパラメータの間にコンマがあってはいけません)。MyVar.MyProperty.MyMethod "String to pass"
のように、プレーン変数の後にドットで区切られた1つまたは複数の識別子を持つものに限定されます。v1コマンドから関数への変換は概ね以下の通りです(ただし、一部の関数は後述するように変更されています):
以下に記す場合を除き、すべての制御フロー文は式も受け付けます。
パラメータを取るすべての制御フロー文(現在、2語のLoop文を除く)は、パラメータリストを括弧で囲み、名前と括弧の間にスペースを入れずにサポートします。例えば、return(var)
。しかし、これらは関数ではないので、例えば、x := return(y)
は無効です。Ifと Whileは、すでにサポートしています。
Loop(Loop Countを除く)の後に、「引用」したり変数で囲むことのできない副キーワード(Files、Parse、ReadまたはReg)が続くようになりました。現在、キーワードの後にカンマを付けることができますが、これはパラメータではないので必須ではありません。OTBは全モードで対応しています。
Goto、Break、Continueは、v1の(goto label
がlabel:
に飛ぶ)と同様、引用符のないラベル名を必要とします。ラベルに動的にジャンプするには、名前のすぐ後に括弧を使用します:goto(expression)
。ただし、これは関数ではないので、式の途中で使用することはできません。括弧はBreakやContinueでも使えますが、その場合、パラメータは1つのリテラル数値か引用符で囲まれた文字列でなければなりません。
Gosubが削除され、SetTimerや Hotkeyなどの機能でラベルが使用できなくなりました。
{
には、それぞれ対応する}
が必要なので、通常、エラーになります。また、ラベルサブルーチンよりも関数の方が境界を特定しやすい場合もあります。ホットキーや自動置換でないホットストリングは、ラベルではなくなり、代わりに(自動的に)機能を定義するようになりました。複数行のホットキーの場合、return
で終了させるのではなく、中括弧を使ってホットキーの本体を囲みます(終了中括弧はこれを意味します)。ホットキーを明示的に呼び出すには、::
と{
の間にfuncName(ThisHotkey)
を指定します - これは v1.1.20+ でも行えますが、現在はパラメータがあります。関数定義が明示されていない場合、パラメータはThisHotkeyと命名されます。
注:ホットキー関数はデフォルトでassume-localであるため、宣言なしでグローバル変数に代入することはできません。
関数名と変数名が共有名前空間に配置されるようになりました。
Func("MyFunc")
の代わりにMyFunc
を使用します。MyFunc
の代わりに"MyFunc"
を使用してください。名前(文字列)の受け渡しはサポートされなくなりました。%myVar%()
の代わりにmyVar()
を使用します。%myVar%()
は、実際にダブルデフを行い、その結果を呼び出すようになり、f := %myVar%, f()
と同等になりました。関数を名前(文字列)で扱うことはできるだけ避け、代わりにリファレンスを使用します。氏名は数字で始まることはできず、従来は認められていた以下の文字を含むことはできません:@ # $
。使用できる文字は、英字、数字、アンダースコア、非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)
と同じ意味です。
多くのクラスが事前に定義されており、ユーザー定義クラスと同じように、グローバル変数名を効果的に予約することができます。(ただし、後述するスコープの変更により、このことから生じる問題はほとんど緩和されます。) クラスの一覧は、「組み込みクラス」を参照してください。
スーパーグローバル変数が廃止されました(組み込み変数を除く、再宣言やシャドウができないので同じではありません)。
想定ローカル関数内で、与えられた名前が宣言や非動的代入、参照(&)演算子のターゲットとして使用されていない場合、既存のグローバル変数に解決することがあります。
換言:
global
宣言を持たない関数は、グローバル変数を直接変更することはできません(意図しない副作用の原因の1つを排除します)。class
を追加しても、既存の関数の動作に影響を与える可能性ははるかに低くなります。global
キーワードは、現在、グローバルスコープで使用すると冗長になりますが、明確にするために使用することができます。このように宣言された変数は、スーパーグローバルではないため、ローカル変数と衝突する可能性が非常に低くなりました(手動でスクリプトを組み合わせる場合や#Includeを使用する場合などです)。その反面、利便性が失われる部分もあります。強制ローカルモードは削除されました。
ローカル静的変数は、自動実行セクションが始まる前に線形順序で実行されるのではなく、実行が到達したときに初期化されます。各イニシャライザーは、2回目に到達したときには何の効果もありません。複数の宣言を行うことができ、同じ変数に対して異なるタイミングで実行することができます。メリットは複数あります:
if IsSet()
を必要とせず1回しか実行しません。static x += 1
のような複合代入が許可されます。(この変更は、local
と global
ですでに許可されていたため、コードサイズをわずかに減らすことができました。)注: static init := somefunction()
は、somefunctionの自動実行には使えなくなりました。しかし、ラベルとリターンに基づくサブルーチンを完全に回避できるようになったため、自動実行セクションはスクリプト全体に及ぶことができるようになりました。
変数をlocal
で宣言しても、その関数がassume-globalにならなくなりました。
ダブルデフがロード時に解決される変数との整合性が高くなり、新しい変数を作成することができなくなりました。これにより、いくつかの矛盾や共通の混乱点を回避することができます。
ダブルデフが何らかの理由で失敗した場合、エラーが発生するようになりました。以前は、無効な名前を持つケースは黙って空文字列を生成し、その他のケースは空の変数を生成して返していました。
引用リテラル文字列は、"ダブル"
または'シングル'
の引用符で書くことができますが、同じ符で始まり、同じ符で終わらなければなりません。直訳の引用符は、マークの前にエスケープ文字 - `"
または`'
を置くか、反対のタイプの引用符を使用することで記述します:'"42"が答えです'
。引用符を二重にしても特別な意味はなく、auto-concatではスペースが必要なのでエラーになる。
演算子&&
,||
,and
および or
は、JavaScript や Lua と同様に、結果を決定したいずれかの値を出力します。例えば、"" or "default"
は、1ではなく、「default」を出力します。純粋なブール値(0または1)を必要とするスクリプトでは、!!(x or y)
または(x or y) ? 1 : 0
を使うことができます。
Auto-concatでは、すべてのケースで少なくとも1つのスペースまたはタブが必要になりました(v1のドキュメントでは、スペースが「あるべき」とされています)。
x(), y()
のような複数文の式の結果は、最初の(一番左の)部分式ではなく、最後の(一番右の)部分式になります。v1、v2ともに、部分式は左から右の順番で評価されます。
カンマの後のEqualsは、割り当てられなくなりました:x:=y, y=z
のy=z
は、代入ではなく非効率的な比較です。
:=
、+=
、-=
、*=
、/=
、++
、--
は、単独で使用されても、x := y, y += 2
など他の演算子と組み合わされても、一貫した動作をする。従来は、式内でエラーが発生した場合や、数学演算で空白の値が使用された場合に、動作に違いがありました。
!=
は =
と同様に常に大文字と小文字を区別するようになり、!==
は ==
と対になるものとして追加された。
<>
は、廃止されました。
//
は、浮動小数点数が与えられた場合、例外を投げるようになりました。以前は、負の浮動小数点と負の整数で結果が矛盾していました。
|
,^
,&
,<<
、および、>>
は、浮動小数点数が与えられた場合、整数に切り捨てられるのではなく、例外を投げるようになりました。
科学的記数法は、小数点以下がなくても使用可能です(ただし、いずれにせよ浮動小数点数を生成します)。数値文字列を整数に変換する際、科学的表記もサポートされます(例えば、"1e3"
は1ではなく1000と解釈されます)。
関数呼び出しでは、パラメータリストの開括弧の前にスペースやタブがなければ、どの関数を呼び出すかを指定するために、事実上どんな下位式でも使用できるようになりました。例えば、MyFunc()
は、それが関数の実際の名前か関数オブジェクトを含む変数かにかかわらず、値MyFuncを呼び出し、(a?b:c)()
は、aに応じてbまたはcを呼び出します。なお、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 :=
。
リテラル文字列の後に曖昧な単項/二項演算子が続く場合、ロード時にエラーが報告されます。例えば、"new counter:" ++Counter
は、おそらくCounterをインクリメントして表示するものと思われますが、厳密には無効な加算と 単項式プラスになります。
word ++
とword --
は、word
がユーザー定義関数である可能性があるため、もはや式ではありません(また ++/-- の後に変数参照を生成する式が続くことがあります)。単独でポストインクリメント式やポストデクリメント式を書くには、変数と演算子の間のスペースを省くか、変数や式を括弧で囲むかします。
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). x is Integer
のようなプリミティブな値も含まれます。(IsInteger(x)
が変換の可能性をチェックするのに対し、これは厳密には型チェックです)。
キーワードcontains
と in
は将来の使用のために予約されています。
&var
(address-of) がStrPtr(var)
とObjPtr(obj)
に置き換えられ、より明確に意図を示し、エラーチェックを強化しました。v1では、address-ofは、varの内部文字列バッファのアドレスを返し、たとえそれが数値(オブジェクトではない)を含んでいたとしても、そのアドレスを返していました。また、オブジェクトのアドレスを取得するために使用され、間違ったタイプのアドレスを取得すると、悲惨な結果になることがあります。
&var
は参照演算子になり、すべてのByRefと OutputVar パラメータで使用され、明快さと柔軟性が向上しました(他の言語の変更も可能になります)。詳しくは、変数参照(VarRef)を参照してください。
式の評価時に、文字列の長さがキャッシュされるようになりました。これにより、パフォーマンスが向上し、文字列が2進数の0を含むことができるようになります。特に:
==
と !==
)が使えます。他の比較演算子は、最初の2進数のゼロまでしか「見えない」のです。ほとんどの関数はまだヌル終端文字列を想定しているので、最初の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. 呼び出されると、この関数はExpressionを評価し、結果を返します。他の関数の内部で使用する場合、Expressionは、外部関数の変数を参照することができます(これは通常の関数定義でも可能です)。
ファットアロー構文は、メソッドやプロパティのゲッター/セッターの定義にも使用できます(この場合、メソッド/プロパティの定義自体は式ではなく、その本体が式を返すだけです)。
メンバーアクセス(ドット)の左側で、リテラルナンバーが完全にサポートされるようになりました。例えば、0.1
は数値ですが、0.min
と 0.1.min
は、ベースオブジェクトが扱えるminプロパティにアクセスします(プリミティブ値参照)。1..2
または1.0.2
は、数字 1.0 の後にプロパティ 2 が続くものです。使用例としては、測定単位、リテラルバージョン番号、範囲などを実装することが考えられます。
x**y
:xとyが整数でyが正の場合、以前は内部で浮動小数点演算を使用していたため精度が落ちていましたが、範囲内であればすべての入力に対して正しい結果を与えるようになりました。オーバーフロー時の動作は未定義です。
こちらも参照のこと:オブジェクト
.
でアクセスするプロパティと、[]
でアクセスするデータ(アイテム、配列、マップ要素)は区別されるようになりました。例えば、dictionary["Count"]
は "Count"の定義を返し、dictionary.Count
は、その中に含まれる単語の数を返すことができる。ユーザー定義オブジェクトは、__Itemプロパティを定義することでこれを利用することができます。
プロパティやメソッドの名前が事前にわからない場合、パーセント記号を使ってアクセスすることができる(しなければならない)。例えば、obj.%varname%()
は、v2のobj[varname]()
と同等です。[]
は、データ(配列要素など)に使用します。
アドホック・オブジェクトを構築するためのリテラル構文は、やはり基本的に{name: value}
です。しかし、プレーンオブジェクトは現在「配列要素」ではなく「プロパティ」しか持たないため、他のコンテキストでプロパティにアクセスする方法との一貫性を保つために、ルールが少し変更されました:
o := {a: b}
は、従来通り「a」という名前を使用します。o := {%a%: b}
は、aのプロパティ名を変数名とし、ダブルデフを行い、結果の変数の内容を使用するのではなく、aのプロパティ名を使用します。つまり、o := {}, o.%a% := b
と同じ効果を発揮するのです。:
の左側の表現は不正です。例えば、{(a): b}
または{an error: 1}
。base.Method()
の "base" という言葉の使用は、2つの概念をよりよく区別するために、super(super.Method()
)に置き換えられています:
super.
またはsuper[
は、メソッド/プロパティのスーパークラス版を呼び出します。"super-class"は、現在の関数の定義にもともと関連付けられていたプロトタイプオブジェクトのベースです。super
は予約語です。.
または[
または(
の接尾辞を付けずに、またはクラスの外で使用しようとすると、ロードタイムエラーになります。base
は、オブジェクトの直接のベース・オブジェクト(ObjGetBase/ObjSetBaseなど)を取得または設定する事前定義プロパティです。予約ではなく、通常のプロパティ名です。super.x
を起動するとエラーが発生しますが、これまでは base.x
は(たとえそれが割り当てであっても)無視されていました。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()
(以前のnew Classname()
)は、__Newメソッドが定義されているのに呼び出せなかった場合(例:パラメータ数が不正確なため)、またはパラメータが渡されたのに__Newが定義されていない場合、オブジェクトの作成に失敗するようになりました。
式内で生成されたオブジェクトや関数から返されたオブジェクトは、式の評価が完了するまで保持され、その後解放されるようになりました。これにより、パフォーマンスが若干向上し、オブジェクトが早期に解放される心配がなく、式内のメモリ管理に一時的なオブジェクトを使用することができます。
オブジェクトには、2進数の0を含む文字列値(キーは不可)を含めることができます。オブジェクトのクローンは、文字列のバイナリデータを、保存された文字列の長さまで保存します(容量ではありません)。歴史的には、バイナリデータや構造体を扱う場合、値の長さを超えてデータを書き込んでいましたが、現在では、代わりにBufferオブジェクトを使用する必要があります。
x.y := z
のような代入式は、x.y の実装方法に関係なく、常にz の値を返すようになりました。プロパティセッターの戻り値は無視されるようになりました。以前:
c := GuiObj.BackColor := "red"
でcを 0xFF0000に設定するなど)、不正確な値を返すものがありました。x.y(z) := v
がシンタックスエラーになりました。以前はx.y[z] := v
と同等でした。一般に、x.y(z)
(メソッドコール)とx.y[z]
(パラメータ化されたプロパティ)は異なる操作ですが、xがCOMオブジェクトの場合は(COMインターフェースの制限により)同等である場合があります。
オブジェクトを他の値と連結したり、Loopに渡すと、以前は空文字列として扱われていましたが、現在はエラーとして扱われます。これは、暗黙のうちに.ToString()
を呼び出すように変更することができます。値を文字列に変換するにはString(x)
を使用します。x
がオブジェクトの場合、.ToString()を呼び出します。
IDispatch(COMインターフェース)を介してオブジェクトが呼び出された場合、呼び出し元に引き渡せない捕捉できない例外は、エラーダイアログを発生させます。(呼び出し側は、具体的な詳細を伴わない追加のエラーダイアログを表示することも、しないこともあります。) これは、ComObjConnectの使用により呼び出されるイベントハンドラにも適用されます。
関数が正式に受け付ける以上のパラメータで動的に呼び出すことができなくなりました。
可変長引数関数は上記の制限の影響を受けませんが、通常、呼び出されるたびに配列を作成し、剰余パラメータを保持します。この配列が不要な場合は、パラメータ名を省略できるようになり、作成されないようになりました:
AcceptsOneOrMoreArgs(first, *) { ... }
これは、追加パラメータが不要なコールバックに使用することができます。
従来は数値キーが連続する標準的なオブジェクトが必要でしたが、可変長引数関数の呼び出しでは、列挙可能なオブジェクトが使用できるようになりました。列挙者が1回の反復で複数の値を返す場合、最初の値のみが使用されます。例えば、Array(mymap*)
は、mymapのキーを含む配列を作成します。
変数型関数呼び出しは、以前は名前付きパラメータを中途半端にサポートしていました。これは、名前付きパラメータの適切な実装を妨げる可能性を排除するために、無効化されています。
ユーザー定義関数は、新しいキーワードunset
をパラメータのデフォルト値として使用し、値が提供されていない場合にパラメータを "unset" にすることができます。その後、この関数は IsSet() を使用して、値が提供されたかどうかを判断することができます。unset
は現在、他のコンテキストでは許可されていません。
スクリプトは、関数呼び出しが定義なしで存在する場合、複雑さと事故の可能性のため、関数ライブラリ(Lib)フォルダから自動的に含まれなくなりました(MyFunc()のMyFunc
が任意の変数になることができるようになりました)。#Include <LibName>
は従来通り動作します。将来のリリースでは、モジュールのサポートに取って代わられる可能性があります。
可変長引数組込関数のMaxParamsの値が、任意の数値(255 や 10000 など)ではなく、MinParamsと同じになるようになりました。Use the IsVariadic property to detect when there is no upper bound.
ByRefパラメータは、ByRef param
の代わりに¶m
を使用して宣言されるようになり、使い方に若干の違いがあります。
ByRefパラメータが暗黙のうちに呼び出し元の変数への参照を取ることはなくなりました。その代わり、呼び出し側は参照演算子(&var
)を使って明示的に参照を渡す必要があります。これにより、参照を別の場所に保存し、可変長引数関数で受け入れ、可変長引数コールで渡すなど、より柔軟な対応が可能になります。
パラメータがByRefとマークされている場合、VarRef以外の値を明示的に渡そうとすると、エラーが発生します。それ以外の場合は,param is VarRef
で参照を確認し,IsSetRef(param)
で対象の変数に値があるかどうかを確認し,%param%
で明示的に参照解除することができます。
ByRefパラメータは、同じ関数が再帰的に呼び出されたときに、前のインスタンスからローカル変数への参照を受け取ることができるようになりました。
ある関数は、別の関数の内部で定義することができます。ネストされた関数は、(適切な条件下で)包含関数から非静的ローカル変数を自動的に「捕捉」し、包含関数が戻った後に使用できるようにすることができます。
また、新しい"太矢印"=>
演算子を使って、ネストした関数を作成することができます。
詳しくは、「ネストされた関数」をご覧ください。
宣言された変数やオプションのパラメータを初期化する場合は、=
の代わりに:=
を使用する必要があります。
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、Try内で例外が発生しなかった場合に実行されます(エラーや値が発生した場合は、値のクラスに合致するCatchがなくても実行されません)。そのため、Elseを中括弧なしで使用する場合、以前のバージョンと解釈が異なる場合があります。事例:
if condition { while condition ; 各繰り返しで実行される ;ステートメント } ; これらの中括弧は現在必須であり、そうでなければ else は while と関連付けられる。 else ; 条件が偽の場合に実行されるステートメント
賢い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
は演算子としてまだ予約/未実装となっています。
and
、or
、is
、in
、contains
は、代入や他の二項演算子が続いても、もはや有効な変数名ではないので、行継続演算子として機能します。一方、v1では、and
/or
の後にany ofが続く場合は例外としました:<>=/|^:,
.VeryLongNestedClassName
のように、行頭で.
の右側にスペースやタブがなかった場合、継続に.
が使われると、2つの行は自動的にスペースで区切られなくなります。なお、x .123
は常にプロパティアクセス(自動連結ではない)、x+.123
はスペースの有無にかかわらず動作します。
一般的に、値の型に依存するようなコードでは、v2の方がより一貫した結果を得ることができます。
v1では、変数に文字列とキャッシュされた2進数の両方を含めることができ、変数が数値として使用されるたびに更新されます。このキャッシュされた2進数が値の型を検出する唯一の手段であるため、var+1
や abs(var)
などの式で内部的に行われるキャッシュは、副作用としてvar
の「型」を効果的に変更します。v2はこのキャッシュを無効にするため、str := "123"
は常に文字列、int := 123
は常に整数になります。そのため、str
はもともと純粋な数字が割り当てられている場合を除き、数字として使われるたびに(初回だけでなく)変換する必要があります。
組み込みの「変数」のtrue
、false
、A_PtrSize
、A_Index
、A_EventInfo
は常に純粋な整数を返し、文字列は返しません。v1では特定の最適化により文字列を返すことがありましたが、v2ではそのようなことはありません。
すべてのリテラル数値は、ロード時に純粋な2進数に変換され、その文字列表現は破棄されます。例えば、MsgBox 0x1
はMsgBox 1
と同等であり、MsgBox 1.0000
はMsgBox 1.0
と同等です(浮動小数点数のフォーマットが変更されたため)。数値を変数に格納したり、ユーザー定義関数から返したりしても、純粋な数値の状態を維持することができます。
浮動小数点数のデフォルトのフォーマット指定子が.17g
(0.6f
だった)になり、よりコンパクトで多くのケースでより正確になっています。デフォルトは変更できませんが、Format
を使用することで異なる書式を得ることができます。
引用リテラル文字列および引用リテラル文字列を連結した文字列は、無条件に非数値と見なされなくなりました。代わりに、変数に格納された文字列や関数から返された文字列と同じように扱われます。これには次のような意味があります:
"0"
"は偽とみなされます。("0xA") + 1
と ("0x" Chr(65)) + 1
は失敗ではなく11を生成します。x[y:="0"]
とx["0"]
が同じ挙動になりました。演算子=
と!=
は、オペランドが文字列の場合はアルファベット順に比較し、数値文字列の場合はアルファベット順に比較するようになりました。数値比較は、両方のオペランドが数値であり、少なくとも1つのオペランドが純粋な数値(文字列ではない)である場合にも実行されます。そのため、例えば54
と"530"
は数字で比較され、"54"
と"530"
はアルファベットで比較されます。また、変数に格納された文字列は、リテラル文字列と同じように扱われます。
関係演算子<
,<=
,>
,>=
を数値以外の文字列で使用すると、例外が発生するようになりました。従来は、入力が数値かアルファベットかによって比較されていましたが、リテラル引用文字列は常に非数値とみなされていました。代わりにStrCompare(a, b, CaseSense)
を使用してください。
Type(Value)
は、以下の文字列のいずれかを返す:String、Integer、Float、またはオブジェクトの特定のクラス。
Float(Value)
,Integer(Value)
,String(Value) は
、Valueをそれぞれの型に変換し、変換できない場合は例外を投げます(例:Integer("1z")
)。Number(Value)
は、整数または浮動小数点数に変換します。String(Value)
は、Value
がオブジェクトである場合、Value.ToString()を呼び出します。(理想的には、オブジェクトから文字列への暗黙の変換でも行われるのですが、現在の実装ではこれが困難です。)
オブジェクトは、より構造化されたクラス-プロトタイプのアプローチを採用し、クラス/静的メンバとインスタンスメンバを分離しています。多くの組み込みメソッドやObj関数が移動、名称変更、変更、削除されています。
static
キーワードで定義されたメソッドやプロパティ(ベースクラスから継承したstaticメンバを含む)とネストしたクラスのみを公開するクラスオブジェクト(Classのインスタンス)です。base
となるPrototypeプロパティがあります。クラス本体内の非静的なメソッドやプロパティ定義は、すべてプロトタイプオブジェクトにアタッチされます。myClass.Call()
やmyClass()
のように、静的なCallメソッドを呼び出すことで行われます。これにより、クラスの構築動作を完全にオーバーライドすることができます(例えば、クラスファクトリやシングルトンを実装したり、Objectの代わりにネイティブなArrayやMapを構築したりすることができます)。ただし、初期化は通常__New
で行う必要があります。__New
の戻り値は無視されるようになりました。戻り値をオーバーライドする場合は、Callメソッドから行ってください。混在していたObject型は、Object
、Array
、Map
(連想配列)に分割されました。
Objectは、すべてのユーザー定義および組み込みオブジェクトのルートクラスとなりました(VarRefおよびCOMオブジェクトは除きます)。Object.Prototype
に追加されたメンバーは、すべてのAutoHotkeyオブジェクトに継承されます。
is
オペレーターはクラスを期待するので、x is y
は、ベースオブジェクトチェーンでy.Prototype
をチェックします。yそのものを確認するには、x.HasBase(y)
またはHasBase(x, y)
を呼び出します。
ユーザー定義クラスは、Object
、Array
、Map
などの組み込みクラスを明示的に拡張することも可能です(ただし、拡張することが必ずしも有用とは限りません)。Object
は、何も指定されていない場合のデフォルトの基底クラスです。
new
オペレーターは削除されました。代わりに、MyClass()
のように演算子を省略するだけです。クラスではない別のオブジェクトを元にオブジェクトを構成するには、{}
またはObject()
で(あるいは他の手段で)作成し、そのbase
を設定します。__Init
と __New
は、必要に応じて明示的に呼び出すことができますが、一般的にはクラスをインスタンス化するときにのみ適切です。
ネストされたクラス定義は、単純な値プロパティではなく、getおよびcallアクセッサ関数を持つ動的プロパティを生成するようになりました。これは、次のような行動をサポートするためです:
Nested.Class()
では、Nestedを Nested.Class.Call
、ひいては__New
に渡しません。これは、メソッドとして呼び出される関数オブジェクトの通常の動作です(ここでは、入れ子のクラスはこのように使用されています)。Nested.Class := 1
はデフォルトでエラーとなります(プロパティは読み取り専用です)。GetCapacityとSetCapacityを削除しました。
その他、冗長なObj関数(Objectの組み込みメソッドをミラーリングしたもの)を削除しました。ObjHasOwnProp(旧ObjHasKey)とObjOwnProps(旧ObjNewEnum)は、これらのメソッドを再定義したオブジェクト(およびそれらが定義されていないプリミティブプロトタイプ)を安全に検査するために保持されています。ObjCountはObjOwnPropCount(機能のみ、すべてのObjectに対して)に置き換えられ、Mapは独自のCountプロパティを持ちます。
ObjRawGetとObjRawSetは、GetOwnPropDescと DefinePropに統合されました。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]:=1
でx.y
にオブジェクトが生成されなくなり、x.__itemが2つのパラメータを扱わない限り(またはx.__item.__itemが扱うなど)x[y,z]
はエラーになります。
プロパティがget
を定義し、set
を定義していない場合、値を代入すると、プロパティをオーバーライドする代わりにthrowが発生します。
DefinePropは、メタファンクションを定義することなく、特定のプロパティの取得、設定、または呼び出し時の動作を定義するために使用することができます。クラスのプロパティ定義とメソッド定義は同じ仕組みを利用しているため、プロパティのゲッター/セッターとメソッドを同名で定義することが可能です。
{}
オブジェクトリテラルが、所有プロパティの値やオブジェクトの base
を直接設定するようになりました。つまり、__Set
やプロパティセッターはもはや呼び出されない(これは通常、パラメータリスト内でbase
が設定されている場合にのみ可能である)。
静的/クラス変数のイニシャライザーは、static __Init
メソッドのコンテキスト内で実行されるようになったので、this
はクラスを参照し、イニシャライザーはローカル変数を作成することができます。これらは、クラスが初めて参照されたときに評価されます(自動実行部が始まる前に評価されるのではなく、厳密には定義順に評価されます)。クラスがすぐに参照されない場合は、実行中にクラス定義に到達した時点で評価されるため、グローバル変数の初期化は、クラスに入れずに最初に行うことができます。
メタファンクションが大幅に簡略化され、通常のメソッドと同じように動作するようになりました:
super.__xxx()
を呼び出すことができます。return
を使うかどうかで動作が変わることはありません(もちろん、__getや__callは依然として値を返す必要がありますが)。メソッドやプロパティのパラメータは、Arrayとして渡されます。これは、連鎖するベース/スーパークラスの呼び出しを最適化し、(MaxParamsの検証との組み合わせで)作者に引数を処理することを奨励します。For __setの場合、代入される値は別途渡されます。
this.__call(name, args) this.__get(name, args) this.__set(name, args, value)
定義されたプロパティやメソッドは、ベースオブジェクトで定義されたかどうかにかかわらず、メタファンクションよりも優先されます。
オブジェクトがforループに渡されるときや、SetTimerで関数オブジェクトが呼び出されるときなど、__Enum(旧 _NewEnum)またはCallの内部呼び出しでは__Callは呼び出されません。
静的メソッド __New は、そのクラスで定義されているか、スーパークラスから継承されている場合、各クラスの初期化時に呼び出されます。詳しくは、静的/クラス変数(上)、および、クラスの初期化をご覧ください。
class Array extends Object
配列オブジェクトは、インデックス1が最初の要素である値のリストまたはシーケンスを含んでいます。
配列の要素を代入・取得する場合、インデックスの絶対値が 1 から配列のLengthの間でなければなりません。そうでない場合は例外が発生します。配列のサイズは、適切な方法で要素を挿入または削除するか、Lengthを代入することで変更することができます。
現在、要素にアクセスする際には括弧が必要です。例えば、a.1
はプロパティを指し、a[1]
は要素を指します。
負の値を使用すると、逆方向のインデックスを作成することができます。
Clone、Delete、InsertAt、Pop、Push、RemoveAtの使い方は基本的に変わりません。HasKeyはHasに名称変更されました。Lengthがプロパティになりました。Capacityプロパティを追加しました。
配列は、Array(values*)
または[values*]
で構築することができます。変数型関数は、パラメータの配列を受け取ります。また、配列はいくつかの組み込み関数でも作成されます。
Forループの使用法は、for val in arr
またはfor idx, val in arr
で、デフォルトではidx = A_Index
です。つまり、値がない要素も列挙され、変数が1つしか渡されない場合はインデックスが返されない。
Mapオブジェクトは、v1オブジェクトに似た機能を持つ連想配列ですが、より曖昧さがありません。
現在、Floatキーは文字列に変換されたままです。
a.b
はプロパティを、a["b"]
は要素を意味します。v1とは異なり、配列の要素を代入することで誤ってプロパティやメソッドを無効化することはできません。
マップにDefaultプロパティが定義されていない限り、存在しない要素の値を取得しようとすると例外がスローされます。MapObj.Get(key, default)
は、各リクエストに対して明示的にデフォルト値を提供するために使用することができます。
キーと値のペアのリストからマップを作成するには、Map(Key, Value, ...)
を使用します。
列挙者モデルの変更:
Call(&a)
として定義されたメソッドはa := next_value
を代入する必要がありますが、Call(a)
はVarRefを受け取るので%a% := next_value
を代入すべきです。配列要素とプロパティが分離されたため、プロパティの列挙にはOwnPropsを呼び出して明示的に列挙者を作成する必要があります。
バウンド関数が呼び出されると、呼び出し元から渡されたパラメータが、バウンドファンクションの作成時に省略された位置を埋めます。例えば、F.Bind(,b).Call(a,c)
はF(,b,a,c)
ではなくF(a,b,c)
を呼び出します。
COMラッパーオブジェクトは、バリアントタイプによっていくつかの異なるクラスのインスタンスとして識別されるようになりました(以前のように、どのメソッドとプロパティをサポートするかに影響します):
ComValue
は、すべてのCOMラッパーオブジェクトの基本クラスです。ComObject
は、VT_DISPATCHの非NULLポインタのためのもので、つまり、通常、通常のオブジェクト構文を使用してスクリプトから呼び出すことができる有効なCOMオブジェクトです。ComObjArray
は、VT_ARRAY(SafeArrays)用です。ComValueRef
は、VT_BYREF用です。これらのクラスは、obj is 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)
を追加する必要があるとは限らず、多くのスクリプトが古い関数を間違って使用していたためです。
VT_BYREF、VT_ARRAY、VT_UNKNOWNのバリアントタイプを持つCOMラッパーオブジェクトに、ComObjValue(ComObj)と同等のPtr
プロパティが付くようになりました。これにより、DllCallやComCallにPtrのarg型で渡すことができるようになります。また、VT_BYREF(呼び出し元の型付き変数にアクセス)、VT_ARRAY(SAFEARRAYフィールドにアクセス)、VT_UNKNOWN(vtableポインタを取得)で使用できるNumPutやNumGetにオブジェクトを直接渡すことができます。
VT_DISPATCHまたはVT_UNKNOWNというバリアントタイプとNULLインターフェイスポインターを持つCOMラッパーオブジェクトが、読み取りまたは割り当て可能なPtrプロパティを持つようになりました。非NULLポインタが割り当てられると、このプロパティは読み取り専用になります。これはDllCallやComCallでの使用を想定しており、関数が戻った後にポインタを手動でラップする必要がありません。
ComObjArrayの列挙がArrayと一致するようになりました。つまり、for value in arr
やfor index, value in arr
ではなく、for value, vartype in arr
です。。indexの開始値はComObjArrayの下限値(arr.MinIndex()
)であり、通常は0です。
整数型I1、I8、UI1、UI2、UI4、UI8は、StringではなくIntegerに変換されるようになりました。これらはCOMコールで稀に発生しますが、VT_BYREFラッパーにも適用されます。VT_ERRORはIntegerに変換されなくなり、代わりにComValueが生成されます。
COMオブジェクトが、プロパティやメソッドの呼び出しに失敗したときに、A_LastErrorを設定しなくなりました。
COMオブジェクトは「デフォルト・プロパティ」を持つことができ、これには2つの用途があります:
MsgBox obj
は、そのデフォルトのメンバーを呼び出すことによって、オブジェクトを評価します。AutoHotkey v1にはデフォルトプロパティの概念がなかったため、COMオブジェクトラッパーはプロパティ名が省略された場合、デフォルトプロパティを呼び出していました(例:obj[]
またはobj[,x]
)。
しかし、AutoHotkey v2では、プロパティを配列/マップ/コレクションの項目から分離しており、そのためにobj[x]
はオブジェクトのデフォルトのプロパティ(xが存在するかどうか)にマッピングされています。AutoHotkeyオブジェクトの場合、これは__Item
です。
配列やコレクションを表すCOMオブジェクトの中には、デフォルトのプロパティを公開していないものがあるため、v2では[]
でアイテムにアクセスすることができません。例えば、JavaScriptの配列オブジェクトや、JavaScriptで通常使用される他のいくつかのオブジェクトは、配列要素をプロパティとして公開します。このような場合、arr.%i%
は配列の要素-プロパティにアクセスするために使用することができます。
AutoHotkey v2のArrayオブジェクトをJavaScriptに渡すと、プロパティにアクセスしようとするため、JavaScriptのarr[i]
でその要素を取得することができない。
IDispatchインターフェースを介したAutoHotkeyオブジェクトの呼び出しが、VT_BYREFパラメータを透過的にサポートするようになりました。これは、COMイベント(ComObjConnect)で最も一般的に使用されるでしょう。
各VT_BYREFパラメータに対して、無名の一時的なvarが作成され、値が呼び出し元の変数からコピーされ、VarRefがAutoHotkey関数/メソッドに渡されます。リターン時には、一時的な変数から呼び出し元の変数に値がコピーされます。
関数/メソッドは、パラメータをByRef(&
付き)で宣言するか、明示的に再参照することで、値を割り当てることができます。
例えば、VT_BYREF|VT_BOOL
型のパラメータは、以前はComObjRefオブジェクトを受け取り、pbCancel[] := true
またはNumPut(-1, ComObjValue(pbCancel), "short")
という値が割り当てられたはずです。これで、パラメータを&bCancel
と定義してbCancel := true
のように代入することも、pbCancel
と定義して%pbCancel% := true
のように代入することもできるようになりました。
削除:
ControlSend "{Raw}"
またはControlSendTextを使用します)MyFunc
のように直接参照を使用します)Send "{Raw}"
またはSendTextを使用します)KeyHistory N
を使用します)改名:
全リストは上記をご覧ください。
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は、待ち時間が終了した場合は0 (false)を、そうでない場合は1 (true)を返すようになりました。ErrorLevelを削除しました。0を指定しても、0.5を指定したのと同じではなく、最短の待ち時間が発生するようになりました。
ComObj()
:この機能は、ワイルドカードのような名前で、さまざまな接尾辞をつけることができました。ComObjActive(CLSID)
,ComObjParameter(vt, value)
,ComObjEnwrap(dsp)
のように、特定の種類のパラメータでよく使われる名前もありました。その代わり、関数やクラスが別々になり、ワイルドカードの名前もなくなりました。詳細は「COMオブジェクト(ComObject)」を参照してください。
Control:Control関数、SendMessageとPostMessageで使用されるControlパラメータにいくつかの変更が加えられました:
ahk_parent
特殊値を置き換えます。ControlGetFocusは、ClassNNの代わりにコントロールのHWNDを返すようになり、ウィンドウにフォーカスされたコントロールがないことを正常に判断した場合、エラーがあると見なされなくなりました。
ControlMove、ControlGetPos、ControlClickで、ウィンドウ座標の代わりにクライアント座標(GuiControlのような)を使用するようになりました。クライアント座標は、ウィンドウのタイトルバーとボーダーを除いたクライアント領域の左上からの相対値です。(コントロールはクライアントエリア内でのみレンダリングされます。)
ControlMove、ControlSend、ControlSetTextは、他のControl関数と同様にパラメータの順序を使用するようになりました。つまり、Control、WinTitle、WinText、ExcludeTitle、ExcludeTextは、常に一緒に(パラメータリストの最後に)まとめられ、記憶しやすくなっています。
すべてのモードは何かに対して相対的であるため、CoordModeはモードとして "Relative"を受け付けなくなりました。"Window"と同義語だったので、代わりにそちらを使ってください。
Editは、シェル動詞 "edit "が登録されていない場合、.ini
ファイルタイプに対してフォールバック動作をしていました。スクリプトファイルには.ini
という拡張子は期待できないため、これを削除しました。AutoHotkey.ini
は、AutoHotkeyの古いバージョンではデフォルトのスクリプト名でした。
Editは、スクリプトがstdinから読み込まれた場合、*
のためのエディタを開こうとするのではなく、何もしないようになりました。
EnvSetで、Valueパラメータが完全に省略された場合、環境変数を削除するようになりました。
Exitは、これまで、スクリプトが永続的でない場合、Exitを呼び出したスレッドによって中断された他のスレッドがあったとしても、ExitAppとして動作していました。もはや、これ以上ないほどです。その代わり、常に現在のスレッドを適切に終了させ、(非永続的な場合)最後のスレッドが終了した後にのみスクリプトを終了させます。これによりFinally文が実行されてローカル変数が解放され、ローカル変数に含まれるオブジェクトに対して__delete
が呼び出される可能性があります。
FileAppendは、FileReadおよびFileOpenと同様に、行末の変換を行わないことをデフォルトとしています。FileAppendとFileReadは、オプションの接頭辞を置き換える別のOptionsパラメータを持ち、オプションのエンコーディング名(FileReadの*Pnnn
オプションに取って代わる)を含めることができます。FileAppend、FileRead、FileOpenは、行末変換を有効にするために"`n"
を使用します。FileAppendとFileReadは、コードページ変換(バイナリデータの読み書き)を無効にするオプション"RAW"
をサポートしています。FileReadはこの場合、Bufferオブジェクトを返す。これは*c
(ClipboardAllを参照)を置き換えるものです。FileAppend may accept a Buffer-like object, in which case no conversions are performed.
FileCopyとFileMoveで、コピー元のパスに*
または?
がなく、ファイルが見つからなかった場合に例外が発生するようになりました。ただし、ソースパスにワイルドカードが含まれている場合、0個のファイルをコピーまたは移動することは、依然としてエラーとはみなされません。
FileOpenがファイルを開くのに失敗した場合、例外を投げるようになりました。そうでなければ、実際の障害発生箇所ではなく、オブジェクトに最初にアクセスしようとしたときに例外が発生します(スクリプトが障害をチェックしない場合)。
File.RawRead:変数を直接渡す場合、その変数の内部文字列バッファのアドレスは使用されなくなります。そのため、アドレスを含む変数を直接渡すことができる(v1ではvar+0
のようなものが必要であったが)。
スクリプトによって割り当てられたバッファの場合、変数よりも新しいBufferオブジェクトが優先されます。任意のオブジェクトを使用できますが、Ptrと Sizeプロパティを持つ必要があります。
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で、pattern with spaces*.ext
のようなフィルターパターンからスペースを取り除かなくなりました。テストでは、パターンの両側にあるスペース(*.cpp; *.h
のセミコロンの後など)は、すでにOSによって無視されているので、悪影響はないはずです。
D
オプション文字による「フォルダ選択」モードでFileSelectを使用できるようになりました。
FileSetAttribは、+、-、^ のプレフィックスが存在しない場合、何もしないのではなく、属性を上書きするようになりました。例えば、FileSetAttrib(FileGetAttrib(file2), file1)
は、file2の属性をfile1にコピーします(file2が持っているものは追加し、持っていないものは削除します)。
FileSetAttribとFileSetTimeです:OperateOnFoldersとRecurseのパラメータは、Loop Filesと同じ1つのModeパラメータに置き換えられました。例えば、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のActionパラメータに、関数オブジェクトまたはホットキー名を指定するようになりました。ラベルや関数名はサポートされなくなりました。ホットキー名が指定されている場合は、そのホットキーの本来の機能が使用されます。また、以前とは異なり、#HotIf(旧#If)とも連動します。
On
、Off
、Toggle
、AltTab
、ShiftAltTab
、AltTabAndMenu
、AltTabMenuDismiss
。以前の動作は、ラベル/関数が存在する場合、その名前を使用するものでしたが、Labelパラメータに変数参照や式が含まれていない場合に限り、その名前を使用します。Hotkeyと Hotstringで、Suspendを免除するSオプション(新しい#SuspendExempt指令と同等)と、免除を無効にするS0オプションが追加されました。
「Hotkey If」をはじめとするIfサブコマンドを個別機能に置き換えました:HotIf、HotIfWinActive、HotIfWinExist、HotIfWinNotActive、HotIfWinNotExist。
HotIf(旧Hotkey If)は、and
またはor
演算子を使用した式を認識するようになりました。v1では、これらの演算子はロード時に&&
や ||
に置き換えられるため、これは機能しませんでした。
HotkeyにUseErrorLevelオプションがなくなり、ErrorLevelを設定しないようになりました。失敗した場合は例外がスローされます。エラーメッセージは、Exception.Extra
にキーまたはホットキーの名前を、例外のクラスで失敗の理由を示す、一定の(より短い)メッセージに変更されました。
#HotIf(旧#If)は、1つのパラメータ(ThisHotkey)を持つ関数を暗黙のうちに作成するようになりました。すべての関数のデフォルトとして、この関数はassume-localです。式はローカル変数の作成とグローバル変数の読み込みが可能ですが、式に宣言を含めることができないため、グローバル変数に直接代入することはできません。
#HotIfは、WinActiveや WinExistへの単純な呼び出しをフックスレッドで直接評価できるように最適化されています(v1では#IfWinが、HotIfWinは現在もそうです)。これにより、パフォーマンスが向上し、スクリプトがビジー/無反応の場合に問題が発生するリスクを低減することができます。この最適化は、WinActiveまたはWinExistへの単一の呼び出しと最大2つのパラメータを含む式に適用され、各パラメータは単純な引用文字列で、結果はオプションで!
または not
で反転されます。例えば、#HotIf WinActive("Chrome")
や#HotIf !WinExist("Popup")
のようなものです。これらの場合、任意の基準の組み合わせを持つ最初の表現は、表現またはウィンドウ基準のいずれかによって特定することができます。例えば、HotIf '!WinExist("Popup")'
とHotIfWinNotExist "Popup"
は同じホットキー変種を参照しています。
KeyHistory N
は、キーヒストリーを表示するのではなく、キーヒストリーバッファーのサイズを変更します。これは"#KeyHistory N"に置き換わるものです。
ImageSearchは、画像が見つかった場合は 1 (true)、見つからなかった場合は 0 (false)を返し、検索ができなかった場合は例外を投げる。ErrorLevelが設定されていない。
IniDelete、IniRead、IniWriteは、A_LastErrorをオペレーティングシステムのGetLastError()関数の結果に設定します。
要求されたキー、セクション、ファイルが見つからず、Defaultパラメータが省略された場合、IniReadは例外を投げる。Defaultに値が与えられた場合、""
でも例外は発生しない。
InputHookが Shift+Backspaceを Backspaceと同じように扱うようになり、代わりに`b
に転写されるようになりました。
InputBoxは、より使いやすくなるように構文が見直されました(パラメータが少なくなっています)。使い方はInputBoxを参照してください。
InStrのCaseSensitiveパラメータがCaseSenseに変更され、0、1または "Locale"が指定できるようになりました。
InStrは、Occurrenceが負の場合(以前は結果が0になる)、右から左に検索するようになり、負のStartingPosが正のOccurrenceで使用されても右から左に検索しないようになりました。(ただし、StartingPosが負でOccurrenceが省略された場合は、右から左に検索されます。) これにより、ループ内での右から左への検索が容易になり、負のStartingPosを使用しても、左から右への検索が可能になります。
InStr(a, b,, -1, 2)
は左から右へ検索するようになりました。右から左へ検索する場合は、InStr(a, b,, -1, -2)
を使用します。InStr(a, b, -2, -2)
になるはずです。KeyWaitは、待ち時間が終了した場合は0 (false)を、そうでない場合は1 (true)を返すようになりました。ErrorLevelを削除しました。
MouseClickと MouseClickDragは、マウスボタンの入れ替えに関するシステム設定の影響を受けなくなりました。"Left"は常にプライマリボタン、"Right"はセカンダリボタンです。
MsgBoxは、最もよく使われるパラメータを優先し、使いやすさを向上させるために構文が変更されました。使い方の概要は、さらに下のMsgBoxを参照してください。
NumPut/NumGet:変数を直接渡す場合、その変数の内部文字列バッファのアドレスは使用されなくなります。そのため、アドレスを含む変数を直接渡すことができる(v1ではvar+0
のようなものが必要であったが)。スクリプトによって割り当てられたバッファの場合、変数よりも新しいBufferオブジェクトが優先されます。任意のオブジェクトを使用できますが、Ptrと Sizeプロパティを持つ必要があります。
NumPutのパラメータは、値の並びを変更し、各数値の前に(現在は必須の)タイプ文字列を置くことができるようになった。事例:NumPut("ptr", a, "int", b, "int", c, addrOrBuffer, offset)
。NumGetでもTypeが必須となりました。(DllCallと比較して、NumPutの入力パラメータはdll関数のパラメータに対応し、NumGetの戻り型パラメータはdll関数の戻り型文字列に対応します。)
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
は、一時停止を切り替えるのに適さなくなりました。したがって、Pause()
は現在のスレッドを一時停止するだけになり(ListVars/Pauseのような組み合わせの場合)、Pause(Value)
は常に基本スレッドで動作するようになりました。Valueは、0、1または-1でなければならない。第2パラメータを削除しました。
PixelSearchと PixelGetColorは、他の関数との整合性のために、BGRの代わりにRGB値を使用します。どちらの関数も、問題が発生すると例外をスローし、ErrorLevelを設定しなくなりました。PixelSearchは、その色が見つかった場合、1 (true)を返します。PixelSearchのスローモードは、デスクトップコンポジションとの非互換性により、ほとんどの最新システムで使用できないため、削除されました。
PostMessage:後述のSendMessageを参照してください。
Randomは、オペレーティングシステムの乱数発生器を利用し、いくつかの制限を解除し、より便利に使用できるように改良されました。
Random(9)
は0から9の間の数を返します。RegExMatchのオプションOとPが削除され、O(オブジェクト)モードが必須となりました。RegExMatch オブジェクトが列挙型(forループ)に対応しました。マッチオブジェクトの構文が変更されました:
match.subpat
(subpatはサブパターン/キャプチャグループの名前)という省略法を実装するために使用されます。プロパティが継承されている場合、__Getが呼び出されなくなったため、以下のサブパターン名は省略構文で使用できなくなりました:Pos、Len、Name、Count、Mark。(例えば、match.Len
は常にマッチ全体の長さを返し、キャプチャした文字列は返しません。)match.name
はデフォルトで関数を返すことになるため、メソッドはプロパティに置き換えられ、または補完されました:
match.Name
はエラーを投げます)。match.Value()
の代わりにmatch.0
またはmatch[]
を、match.Value(N)
の代わりにmatch[N]
を使ってください。RegisterCallbackはCallbackCreateに名称変更し、クロージャをより活用できるように変更しました:
&
オプション(パラメータリストのアドレスを渡す)を追加しました。CallbackFree(Address)
を追加しました。レジストリ関数(RegRead、RegWrite、RegDelete):v1.1.21+で追加された新しい構文が唯一の構文となりました。ルートキーとサブキーが結合されます。RootKey, SubKey
の代わりに、RootKey\SubKey
と書いてください。リモートレジストリに接続する場合は\\ComputerName:RootKey, SubKey
の代わりに\\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は何もしないようになりました。
ErrorLevelが削除されたため、RunおよびRunWaitが UseErrorLevelオプションを認識しなくなりました。代わりにTry/Catchを使用します。A_LastErrorは無条件に設定され、例外が捕捉/抑制された後に検査することができます。RunWaitは、終了コードを返します。
Send(およびその亜種)は、ホットキーおよびClickと一致する方法で{LButton}
と {RButton}
を解釈するようになりました。つまり、ユーザーがシステム設定でボタンを入れ替えても、LButtonがプライマリボタン、RButtonがセカンダリボタンになります。
SendMessageと PostMessageでは、wParamとlParamが整数またはPtrプロパティを持つオブジェクトである必要があります。以前は、"
で始まる式であればアドレスで文字列が渡されましたが、それ以外の文字列は整数に強制されていました。変数のアドレス(以前は&var
、現在はStrPtr(var)
)を渡しても、変数の長さを更新しなくなりました(VarSetStrCapacity(&var, -1)
を使用してください)。
SendMessageとPostMessageは、失敗(またはタイムアウト)時に例外を投げるようになり、ErrorLevelを設定しないようになりました。SendMessageは、メッセージの返信を返します。
SetTimerはラベル名や関数名をサポートしなくなりましたが、式が使えるようになり、関数は名前で直接参照できるようになったので、使い方は非常に似ています:SetTimer MyFunc
。オブジェクトを受け取る他の関数と同様に、SetTimerもオブジェクトを返す式が使えるようになりました(以前は変数参照が必要でした)。
Sortは、以下の変更を受けました:
Output := Sort(Input [, Options, Callback])
になりました。C
オプションで、他の関数(CL
以外)のCaseSenseパラメータと同等の接尾辞を受け付けるようになりました:CLocale CLogical COn C1 COff C0
。特に、「論理」比較モードのサポートが新しくなりました。Sound関数:SoundGetとSoundSetは、Vista+のサウンドAPIの機能によりマッチするように改訂され、XPのサポートを取りやめました。
StrGet:Lengthが負の場合、その絶対値は、文字列が含むかもしれない2進数のゼロを含む、変換する正確な文字数を示します。言い換えれば、結果は常に正確にその長さの文字列になります。Lengthが正の場合、変換後の文字列はv1のように最初の2進数ゼロで終了します。
StrGet/StrPut:Addressパラメータには、新しいBufferオブジェクトのようなPtrと Sizeプロパティを持つオブジェクトを指定することができます。読み書きが自動的に制限されるのは、Size(単位はバイト)です。Lengthも指定された場合は、Size(UTF-16の場合は2倍)を超えてはいけません。
StrPutの戻り値がバイト単位になったので、Buffer()
に直接渡すことができます。
StrReplaceでは、OutputVarCountの代わりにCaseSenseパラメータが追加され、パラメータが1つ右に移動し、Limitがそれに続いています。
Suspend:ホットキーやホットストリングの最初の行をSuspendの呼び出しにすることで、自動的にSuspendが免除されるようになることはなくなりました。代わりに、#SuspendExempt
またはS
オプションを使用してください。"Permit" パラメータ値は無効となりました。
Switchは、デフォルトで文字列の大文字小文字を区別して比較するようになりました。また、大文字小文字を区別するモードを上書きし、(数値ではなく)文字列の比較を強制するCaseSenseパラメータがあります。以前はStringCaseSenseがOnに変更された場合のみ大文字と小文字を区別していました。
SysGetのサブコマンドは数値のみとなり、その他のサブコマンドは関数に分割されました。詳しくは後述の「サブコマンド」をご覧ください。
TrayTipの使い方が、TrayTip [Text, Title, Options]
に変更になりました。Optionsは、スペースまたはタブで区切られた、0個以上の大文字小文字を区別しないオプションの文字列です。オプションは、Iconx
、Icon!
、Iconi
、Mute
、および以前のように任意の数値です。Textが省略されてもTrayTipが表示されるようになった(v1より誤ってやってしまいにくくなりました)。Timeoutパラメータは、もはや存在しません(Windows Vista以降では効果がありませんでした)。スクリプトは、NIIF_USER (0x4) と NIIF_LARGE_ICON (0x20) フラグを組み合わせて (0x24) 使用し、トレイアイコンの大きいバージョンを通知に含めることができるようになります。NIIF_USER (0x4) は、小さなアイコンのために単独で使用することもできますが、すべてのOSで一貫した結果を得ることができない場合があります。
設定されていない変数を読み込むとエラーが発生するようになったため、#Warn UseUnsetLocal と UseUnsetGlobal は削除されました。IsSetでエラーを回避し、Try/CatchまたはOnErrorで処理することができます。
#Warn VarUnsetを追加しました。デフォルトは MsgBox です。無効化されていない場合、各変数への最初の非動的参照で、直接の非動的代入や参照演算子(&)の対象として使用されたり、IsSetに直接渡されたりすることがない場合に警告が表示されます。
Exit が通常の関数になったため、#Warn UnreachableでExit呼び出しに続く行を到達不能と見なさないようにしました。
トップレベルのクラスが割り当てによって上書きされることがなくなったため、#Warn ClassOverwriteは削除されました。(ただし、ローカル変数によって暗黙的にシャドウされることができるようになりました。これは#Warn LocalSameAsGlobalで検出できます。)
WinActivateは、ウィンドウのアクティブ化に初めて失敗した後、{Alt up}
を送信するようになりました。これにより、タスクバーのボタンが点滅する現象が軽減されることがテストで確認されています。詳しくはドキュメントをご覧ください。
WinClose、WinKill:SecondsToWaitについては、0を指定しても0.5を指定したのと同じではなく、可能な限り短い待ち時間を生成するようになりました。
WinSetTitleと WinMoveは、他のWin関数と同じパラメータ順序を使用します。つまり、WinTitle、WinText、ExcludeTitle、ExcludeTextは、常に一緒に(パラメータリストの最後に)まとめられ、記憶に残りやすくなっています。
各種関数のWinTitleパラメータに、HWND(純粋な整数でなければならない)またはGuiオブジェクトのようなHwndプロパティを持つオブジェクトを受け取ることができるようになりました。DetectHiddenWindows is ignored in such cases, except when used with WinWait or WinWaitClose.
WinMoveでは、DEFAULT
というリテラルワードに対する特別な処理を行わなくなりました。パラメータを省略するか、代わりに空文字列を指定します(v1、v2ともに有効です)。
WinWait、WinWaitClose、WinWaitActive、WinWaitNotActiveは、待ちが終了した場合(タイムアウトが終了しなかった場合)、非ゼロを返します。ErrorLevelを削除しました。WinWait、WinWaitActiveは、見つかったウィンドウのHWNDを返します。WinWaitCloseがLast Found Windowを設定するようになったので、WinWaitCloseがタイムアウトした場合は0 (false)を返し、WinExist()
は最後に見つかったウィンドウを返すようになりました。Timeoutについては、0を指定しても0.5を指定したのと同じではなく、可能な限り短い待ち時間を生成するようになりました。
アンソートです:
InStr、SubStr、RegExMatch、RegExReplaceの StartingPosが負の場合、末尾からの位置と解釈されます。位置-1が最後の文字で、位置0は無効です(v1では位置0が最後の文字でしたが)。
これまでOn/OffやOn/Off/Toggle(他の文字列は不可)を受け付けていた機能では、代わりに1/0/-1が必要となります。OnとOffは、通常、True
と False
に置き換えられるでしょう。On/Offを返していた変数が1/0を返すようになり、式でより便利になりました。
1
、0
、True
、False
を許可します。(他と違い、実際には表現に対応していません。)1
、0
、-1
が可能です。以下の関数は、16進数文字列の代わりに純粋な整数を返します:
A_ScriptHwndも、純粋な整数を返します。
型パラメータが変数である場合、その変数の内容が常に使用され、その名前は使用されます。つまり、引用符で囲まれていない型名はサポートされなくなり、型名は引用符で囲む必要があります。
DllCallがStrまたはWStrとして渡された変数の長さを更新するとき、文字列が適切にヌル終端されていないかどうかを検出し(バッファオーバーランが発生した可能性が高い)、安全な実行が保証されないため、エラーメッセージでプログラムを終了させるようにしました。
AStr
(接尾辞なし)は入力専用になりました。バッファは入力文字列と同じ大きさしかないため、通常、出力パラメータには使えませんでした。AutoHotkeyがANSI用にコンパイルされている場合は、AStrではなくWStrに適用されますが、公式v2リリースはUnicode用にしかコンパイルされません。
関数がStr*
、AStr*
、またはWStr*
パラメータに新しいアドレスを書き込む場合、DllCallは、元の文字列の長さ(おそらく変更されていない)を単に更新するのではなく、対応する変数が提供されている場合は新しい文字列を代入するようになりました。このタイプのパラメータは、通常、入力文字列を変更するために使用されるのではなく、新しいアドレスで文字列を返すために使用されます。
DllCallは、Ptr
パラメータとFunctionパラメータにオブジェクトを受け付けるようになりました(オブジェクトはPtrプロパティを持つ必要があります)。スクリプトによって割り当てられたバッファについては、変数よりも新しいBufferオブジェクトが優先されます。Ptr*
の場合、パラメータの新しい値は、オブジェクトのPtrプロパティに再び割り当てられます。これにより、DllCall(..., "Ptr*", unk := IUnknown())
のような構成が可能になり、DllCall(..., "Ptr*", punk), unk := IUnknown(punk)
と比較して繰り返しが少なく、関数からの出力が適切に解放されるように使用できます(HRESULT
戻り値型のために例外がスローされても、通常その場合関数は非 NULL ポインタを出力しないでしょう)。
DllCallでは、数値型パラメータの値が数値であることが要求されるようになり、数値以外または空文字列が与えられた場合は例外がスローされます。特に、出力パラメータに接尾辞として * または P を使用した場合、出力変数の初期化が必要となる。
スクリプトが数値を含むプレーンな変数を渡す場合、接尾辞に * または P を持つ数値パラメーターの出力値(もしあれば)は無視されます。出力値を受け取るには、&myVarなどの VarRef
や Ptrプロパティを持つオブジェクトを渡します。
新しいHRESULT
の戻り値は、関数が失敗した場合(int < 0
またはuint & 0x80000000
)、例外をスローするものです。これは、実際にHRESULT
を返す関数にのみ使用する必要があります。
サブコマンドキーワードは文字どおり書かなければなりません。引用符で囲むことはできず、変数や式にすることはできません。その他のパラメータはすべて式です。すべてのループサブコマンドが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が削除されました。
InputBoxObj := InputBox([Prompt, Title, Options, Default])
Optionsパラメータは、Guiのコントロールオプションと同様に、スペースまたはタブで区切られた0個以上の大文字と小文字を区別しないオプションの文字列を受け付けます。例えば、サポートされているすべてのオプションが含まれます:"x0 y0 w100 h100 T10.0 Password*"
。T
はタイムアウト、Password
は同等のEditコントロールオプションと同じ使用法です。
幅と高さのオプションは、クライアント領域(タイトルバーとウィンドウフレームを除く領域)のサイズを設定するようになり、テーマへの依存度が低くなりました。
Titleパラメータが空文字列の場合、タイトルは空白となります。ユーザー定義関数のオプションパラメータと同様に、完全に省略された場合のみ、A_ScriptNameがデフォルトとなります。
InputBoxObjは、Result("OK"、"Cancel"、"Timeout"を含む)およびValueのプロパティを持つオブジェクトです。
Result := MsgBox([Text, Title, Options])
Optionsパラメータは、Guiのコントロールオプションと同様に、スペースまたはタブで区切られた0個以上の大文字と小文字を区別しないオプションの文字列を受け付けます。
Iconx
、Icon?
、Icon!
、Iconi
は、アイコンを設定します。Default
の後に整数が続くと、n番目のボタンがデフォルトになります。T
の後に整数または浮動小数点数の数値が続くと、タイムアウトが秒単位で設定されます。Owner
の後にHWNDが続くと所有者が設定され、Gui +OwnDialogs
オプションをオーバーライドします。OK
、OKCancel
、AbortRetryIgnore
、YesNoCancel
、YesNo
、RetryCancel
、CancelTryAgainContinue
、またはスラッシュで区切ったイニシャルのみ(o/c
、y/n
など)、またはスラッシュなしのイニシャルのみです。The return value is the English name of the button, without spaces. これらはv1のIfMsgBoxと同じ文字列です。
Titleパラメータが空文字列の場合、タイトルは空白となります。ユーザー定義関数のオプションパラメータと同様に、完全に省略された場合のみ、A_ScriptNameがデフォルトとなります。
Control、ControlGet、Drive、DriveGet、WinGet、WinSet、Processのサブコマンドは個別の機能に置き換えられ、メインコマンドは削除されました。一部の機能については、名称および使用方法を変更しています。新しい使い方は以下の通りです:
; ここで、...はオプションのControl、WinTitleなどを意味する。 Bool := ControlGetChecked(...) Bool := ControlGetEnabled(...) Bool := ControlGetVisible(...) Int := ControlGetIndex(...) ; 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, ...) ; 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) ; ここで、...はオプションの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])
ProcessExist、ProcessClose、ProcessWait、ProcessWaitCloseは、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を返します。
DriveEjectとDriveRetractが mciSendString の代わりに DeviceIoControl を使用するようになりました。DriveEjectは、エクスプローラーに「取り出し」オプションがあるCD/DVD以外のドライブ(リムーバブルドライブ、固定ディスクとして表示される外付けハードディスクは除く)を取り出すことができます。
ListViewGetContentは、ListViewの「ControlGet List」に代わるもので、現在は従来と同じ使い方ができます。
WinGetList、WinGetControls、WinGetControlsHwndは、改行で区切られたリストではなく、配列を返します。
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
はバイト単位のサイズを返すか設定します(メモリブロックの再割り当て)。PtrとSizeプロパティを持つオブジェクトは、NumPut、NumGet、StrPut、StrGet、File.RawRead、File.RawWrite、FileAppendに渡すことができます。Ptrプロパティを持つオブジェクトであれば、Ptr型のDllCall
パラメータ、SendMessage、PostMessageに渡すことができます。
CaretGetPos([&OutputVarX, &OutputVarY])
は、キャレット(テキスト挿入点)の現在の座標を取得します。これにより、XとYの座標が常に一致し、予期せぬ動作(A_CaretX/Yが現在のCoordModeにない値を返すなど)を引き起こすキャッシュがないことが保証されます。
ClipboardAll([Data, Size])
は、クリップボード上のすべてのデータを含むオブジェクトを作成します(オプションとして、クリップボードの現在の内容を使用する代わりに、以前にクリップボードから取得したデータを受け入れることができます)。クリップボードファイルのデータを読み込む方法と書き込む方法は異なります。データ形式は同じですが、データサイズが常に32ビットであるため、32ビットと64ビットのビルド間でデータを移植することができます。詳しくはv2のドキュメントをご覧ください。
ComCall(offset, comobj, ...)
はDllCall(NumGet(comobj.ptr) + offset * A_Index), "ptr", comobj.ptr, ...)
と同等ですが、戻り値の型のデフォルトがInt
でなくHRESULT
となっています。
ComObject(旧ComObjCreate)とComObjQueryは、IIDが指定されていても、ラッパーオブジェクトを返すようになりました。ComObjQueryでは、第1パラメータにPtrプロパティを持つ任意のオブジェクトを指定することができます。
ControlGetClassNNは、指定されたコントロールの ClassNN を返します。
ControlSendTextは。ControlSendRawと同等ですが、Rawモードの代わりにTextモードを使用します。
DirExist(FilePattern)
、使い方は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)
とInstallMouseHook(Install, Force)
は、柔軟性を高めるために、対応するディレクティブを置き換えるものです。
Integer(Value)
:上記のさらに上の「タイプ」を参照してください。
IsXXX: レガシーコマンドである「if Var is Type」は、一連の関数に置き換えられています:IsAlnum、IsAlpha、IsDigit、IsFloat、IsInteger、IsLower、IsNumber、IsSpace、IsUpper、IsXDigit。IsFloat、IsInteger、IsNumberを除き、パラメータが文字列でない場合、暗黙のうちに文字列に変換すると直感的でない結果を引き起こす可能性があるため、例外がスローされます。
IsSet(Var)
、IsSetRef(&Ref)
:変数に値が割り当てられている場合(その値が空文字列であっても)1 (true)を、そうでない場合0 (false)を返します。0 (false)の場合、式の中で変数を読み込もうとするとエラーが発生します。
Menu()
/MenuBar()
は、v1 Menu サブコマンドに対応する以下のメンバを持つ新しい Menu/MenuBar オブジェクトを返します。メソッド:Add、AddStandard、Check、Delete、Disable、Enable、Insert、Rename、SetColor、SetIcon、Show、ToggleCheck、ToggleEnable、Uncheck。プロパティー:ClickCount、Default、Handle(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)
は、対応するディレクティブを置き換えることで、柔軟性を高めています。
RegDeleteKey([KeyName])
は、レジストリキーを削除します。(RegDeleteは、レジストリループですべてのパラメータを省略する場合を除き、値のみを削除するようになりました。)
SendRawと同等ですが、RawモードではなくTextモードを使用するSendTextです。
StrCompare(String1, String2 [, CaseSense]) は
、-1(String1 は String2 よりも小さい)、0(等しい)、1(より大きい)を返します。CaseSenseは"Locale"にすることができます。
String(Value)
:上記のさらに上の「タイプ」を参照してください。
StrPtr(Value)
は、文字列のアドレスを返します。v1のaddress-ofとは異なり、リテラル文字列と一時的な文字列で使用することができます。
SysGetIPAddresses()
は、削除されたA_IPAddress変数に相当するIPアドレスの配列を返すものです。A_IPAddress%N%
を参照するたびに、すべてのアドレスを検索しますが、1つしか返さないため、複数のアドレスを検索すると、必要以上に指数関数的に時間がかかります。返された配列は、0個以上の要素を持つことができます。
TraySetIcon([FileName, IconNumber, Freeze])
は、"Menu Tray, Icon"を置き換えます。
VarSetStrCapacity(&TargetVar [, RequestedCapacity])
は、v1 VarSetCapacity を置き換えますが、(繰り返し連結の最適化など)UTF-16文字列にのみ使用することを意図しており、したがってRequestedCapacityと戻り値はバイトではなく文字です。
VerCompare(A, B)
は、#Requiresと同じアルゴリズムで2つのバージョン文字列を比較します。
WinGetClientPos([&OutX, &OutY, &OutWidth, &OutHeight, WinTitle, ...])
ウィンドウのクライアント領域の位置とサイズを画面座標で取得します。
#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
など)は、単なるグローバル変数です。現在、仮想変数への参照は(組み込み関数に直接渡される場合を除き)不可能であるため、この区別は重要でしょう。しかし、A_Argsは仮想変数ではない。
数値を返す組み込み変数が、文字列ではなく、整数で返すようになりました。
改名:
削除:
StrLen(Chr(0xFFFF))
で置き換えるか、global A_IsUnicode := 1
で再定義できます)追加:
以下の組み込み変数に値を割り当てることができます:
Fileオブジェクトは、プロパティを呼び出す場合はプロパティ構文、メソッドを呼び出す場合はメソッド構文が厳密に要求されるようになりました。例えば、FileObj.Pos(n)
は有効ではありません。パラメータが少なすぎたり多すぎたりした場合や、読み取り専用のプロパティに値が割り当てられた場合は、例外が発生します。
File.Tell()が削除されました。
Func.IsByRef()が組み込み関数で動作するようになりました。
Gui、GuiControl、GuiControlGetは、Gui()とGui/GuiControlオブジェクトに置き換えられ、一般により柔軟で一貫性があり、より使いやすくなりました。
GUIは通常、名前/番号で参照されません(ただし、GuiObj.Name
で名前を付けることはできます)。その代わり、GUIオブジェクト(とウィンドウ)は、GuiObj := Gui()
のようにGui
クラスをインスタンス化することで明示的に作成します。このオブジェクトは、Guiのサブコマンドを置き換えるメソッドとプロパティを持ちます。Gui.Add()はGuiControlオブジェクトを返し、GuiControlとGuiControlGetコマンドに代わるメソッドとプロパティを持っています。このオブジェクトを変数に格納したり、GuiObj["Name"]
やGuiCtrlFromHwndを使ってオブジェクトを取得することができます。また、イベントハンドラ(g-labelの置き換え)が呼ばれるたびに、パラメータとして渡されます。
これらのメソッドやプロパティの使い方は、1:1 ではありません。より一貫性のある、より柔軟性のあるものにするため、また、バグや制限を修正するために、多くの部分が改訂されています。
ターゲットとなるGUIやコントロールオブジェクトは常に指定されるため、「デフォルト」のGUIは存在しない。LV/TV/SBの関数が(コントロールオブジェクトの)メソッドに置き換えられ、複数のListView/TreeViewの利用がより容易になりました。
イベントに関する情報を含む組み込み変数はありません。これらの情報は、ソースGUIやコントロールを含む、イベントを処理する関数/メソッドにパラメータとして渡されます。
コントロールはまだ名前を付けて参照することができますが、それは単なる名前(GuiObj["Name"]
とGui.Submit()で使用)であって関連変数ではないので、グローバル変数や静的変数の宣言や作成は必要ではありません。値が自動的に変数に格納されることはなく、GuiControl.Valueでアクセスすることができます。Gui.Submit()は、コントロール名をキーとする新しい連想配列を返します。
vName
オプションは、コントロールの名前をNameに設定するだけになりました。
GuiControl.Hwndの代わりに、+HwndVarName
オプションが削除されました。
GUIイベントを自動的に処理する "g-labels"やラベル/ファンクションはもう存在しません。スクリプトは、GuiまたはGuiControlのOnEventメソッドを呼び出して、関心のある各イベントに登録する必要があります。例えば、g-labelでif (A_GuiEvent = "I" && InStr(ErrorLevel, "F", true))
をチェックするのではなく、ItemFocusイベントに対するハンドラを登録するスクリプトとなります:MyLV.OnEvent("ItemFocus", MyFunction)
。MyFunctionは、ItemFocusイベントに対してのみ呼び出されることになります。It is not necessary to apply the AltSubmit
option to enable additional events.
配列は、リストボックスの作成時、項目の追加時、選択された項目の取得時など、これまでパイプで区切られたリストが使われていた場所に使用されます。
スクリプトは、Gui
を拡張し、独自のイベントを処理するクラスを定義することができ、すべてのGUIロジックを自己完結させることができます。
Gui New → Gui()。空のタイトルを渡すと(省略せずに)、デフォルトのタイトルではなく、空のタイトルが表示されるようになりました。
Gui Add → Gui.Add() または Gui.AddControlType()(例:GuiObj.Add("Edit")
またはGuiObj.AddEdit()
)。
Gui Show → Gui.Show()ですが、Titleパラメータを持ちません。タイトルはGui()のパラメータとして、またはGui.Titleプロパティで指定することができます。ただし、ボタンコントロールの場合は、デフォルトのボタンにフォーカスが移動します。
Gui Submit → Gui.Submit()。Submit()がすべての「関連変数」を含む新しいオブジェクトを作成し、返すことを除けば、以前と同じように動作します。
Gui Destroy → Gui.Destroy()。オブジェクトはまだ(スクリプトがそれを解放するまで)存在しますが、使用することはできません。新しいGUIを作成する必要があります(必要な場合)。オブジェクトが削除されるとウィンドウも破壊されますが、ウィンドウが表示されている間はオブジェクトが「生かされる」のです。
Gui Font → Gui.SetFont()。また、GuiControl.SetFont()で、コントロールのフォントを直接設定することも可能です。
Gui Color → Gui.BackColor背景色を設定/返却します。ControlColor(第2パラメータ)はサポートされていませんが、以前サポートしていたすべてのコントロールは、代わりに+Background
オプションで背景を設定することができます。Gui。BackColorは、「Gui Color」とは異なり、Progressコントロールや、無効/読み取り専用のEdit、DDL、ComboBox、TreeView(-Theme
付き)コントロールには影響しません。
Gui Margin → Gui.MarginX、Gui.MarginYプロパティです。
Gui Menu → Gui.MenuBar MenuBar()
で作成したMenuBarオブジェクトを設定/返却します。
Gui Cancel/Hide/Minimize/Maximize/Restore → 同名のGuiメソッド。
Gui Flash → Gui.Flash()ただし、Off
の代わりにfalse
を使用します。
Gui Tab → GuiControl.UseTab()を使用します。デフォルトは、従来通りタブ名のプレフィックスと一致します。第2パラメータにtrueを渡すと、タブ名全体にマッチしますが、v1の「Exact」モードとは異なり、大文字と小文字は区別されません。
明示的にサポートされるすべてのGUIおよびGUI制御イベントの詳細については、イベント(OnEvent)を参照してください。
Sizeイベントは、0、1、2の代わりに、0、-1、1(WinGetMinMaxと一致)を渡します。
ContextMenuイベントは、コントロールごとに、またはGUI全体に対して登録することができます。
DropFilesイベントは、ContextMenuと整合性を取るために、FileArrayと Ctrlパラメータを入れ替えました。
ContextMenuとDropFilesイベントは、ウィンドウ座標の代わりにクライアント座標を使用します(Clientはv2のデフォルトCoordModeでもあります)。
以下の制御イベントは削除されましたが、これらを検出するには、GuiControl.OnNotify()に適切な数値通知コード(Windows SDKで定義)を渡すだけで、簡単に検出できます:K、D、d、A、S、s、M、C、E、および、MonthCalの1、2です。
制御イベントは、イベント名をパラメータとして渡すことはありません(GUIイベントは、そのようなことはありません)。
CustomのNイベントとNormalイベントは、GuiControl.OnNotify()とGuiControl.OnCommand()に置き換えられ、あらゆるコントロールで使用できるようになりました。
リンクの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(Gui.Hwnd または GuiControl.Hwnd を代わりに使用してください)
+Label
+LastFoundExist
Gui GuiName: Default
+/-Background は、解釈とサポートがより一貫しています。ListView/TreeView/StatusBar/Progressだけでなく、"Gui Color" をサポートしていたすべてのコントロールが+BackgroundColor
と +BackgroundDefault
(-Background
と同義)をサポートしました。
Gui.Addは、yp
/xp
の代わりにxp
/p
またはxp+0
/p+0
が使用されていた場合はy+m
/x+m
がデフォルトとなる。つまり、コントロールは全く同じ位置ではなく、前のコントロールの下/右側に配置されます。オフセットが0でない場合は、v1と同じ動作となります。全く同じ位置を使用する場合は、xp yp
を一緒に指定してください。
x+m
と y+m
の後に、x+m+10
(x+m10
も有効だが、可読性が低い)のような付加的なオフセットを付けることができます。
Choose
は、もはやMonthCalの値を指定する冗長な(文書化されていない)方法として機能しません。前回同様、Textパラメータを使用するだけです。
GuiControlGetの空サブコマンドには2つのモードがありました:というデフォルトのモードと、4番目のパラメータがText
という単語であるテキストモードがあります。コントロールタイプに単一の「値」がない場合、GuiControlGetはGetWindowTextの結果を返すのがデフォルトでした(これは必ずしも可視テキストではありません)。コントロールによっては、テキストが表示されていなかったり、テキストの取得をサポートしていなかったりするため、4番目のパラメータを完全に無視することができました。一方、GuiControl.Textは、表示テキスト、非表示テキスト(ControlGetTextが返すテキストと同じ)、または全く何も返しません。
下の表は、GuiControlGetの各モードとコントロールタイプに最も近い同等のプロパティまたは関数を示しています。
コントロール | デフォルト | テキスト | 注釈 |
---|---|---|---|
ActiveX | .Value | .Text | テキストは非表示です。下記をご覧ください。 |
Button | .Text | ||
CheckBox | .Value | .Text | |
ComboBox | .Text | ControlGetText() | AltSubmitが使用された場合、Textの代わりにValueを使用する(ただし、Textがリスト項目に一致しない場合、Valueは0を返します)。Textは大文字・小文字の訂正を行い、ControlGetTextはEditフィールドの内容を返します。 |
Custom | .Text | ||
DateTime | .Value | ||
DDL | .Text | AltSubmitが使用されていた場合、Textの代わりにValueを使用します。 | |
Edit | .Value | ||
GroupBox | .Text | ||
Hotkey | .Value | ||
Link | .Text | ||
ListBox | .Text | ControlGetText() | AltSubmitが使用されていた場合、Textの代わりにValueを使用します。Textは選択された項目のテキストを返し、ControlGetTextは非表示のテキストを返します。下記をご覧ください。 |
ListView | .Text | テキストは非表示です。 | |
MonthCal | .Value | ||
Picture | .Value | ||
Progress | .Value | ||
Radio | .Value | .Text | |
Slider | .Value | ||
StatusBar | .Text | ||
Tab | .Text | ControlGetText() | AltSubmitが使用されていた場合、Textの代わりにValueを使用します。Textは選択されたタブのテキストを返し、ControlGetTextは非表示のテキストを返します。 |
Text | .Text | ||
TreeView | .Text | テキストは非表示です。 | |
UpDown | .Value |
ListBox:複数選択可能なListBoxの場合、TextとValueはパイプで区切られたリストではなく、配列で返されます。
ActiveX:GuiControl.Valueは毎回同じオブジェクトを返しますが、GuiControlGetは毎回新しいラッパーオブジェクトを作成しました。その結果、ComObjConnectの接続を維持するためにActiveXオブジェクトへの参照を保持する必要がなくなりました。
Pos → GuiControl.GetPos()
Focus→Gui.FocusedCtrl、ClassNNの代わりにGuiControlオブジェクトを返します。
FocusV → GuiObj.FocusedCtrl.Name
Hwnd → GuiControl.Hwnd、16進数の文字列ではなく、純粋な整数を返します。
Enabled/Visible/Name → 同名のGuiCtrlプロパティ。
The table below shows the closest equivalent property or method for each mode of GuiControl and control type.
コントロール | (ブランク) | テキスト | 注釈 |
---|---|---|---|
ActiveX | 該当なし | コマンドは何の効果もありませんでした。 | |
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 | ||
ListView | 該当なし | コマンドは何の効果もありませんでした。 | |
MonthCal | .Value | ||
Picture | .Value | ||
Progress | .Value | 接頭辞+ の代わりに+= 演算子を使用します。 | |
Radio | .Value | .Text | |
Slider | .Value | 接頭辞+ の代わりに+= 演算子を使用します。 | |
StatusBar | .Text または SB.SetText() | ||
Tab | .Delete/Add/Choose | ||
Text | .Text | ||
TreeView | 該当なし | コマンドは何の効果もありませんでした。 | |
UpDown | .Value | 接頭辞+ の代わりに+= 演算子を使用します。 |
Move → GuiControl.Move()
MoveDraw → GuiControl.Move()、GuiControl.Redraw()
Focus → GuiControl.Focus()で、SetFocusの代わりにWM_NEXTDLGCTLを使用するようになり、ボタンにフォーカスすると、コントロールへのタブ操作と同じように一時的にデフォルトとして設定されます。
Enable/Disable → GuiControl.Enabledを設定する
Hide/Show → GuiControl.Visibleを設定する
Choose → GuiControl.Choose(n)、ここでnは純粋な整数です。|n
または||n
モードには対応していません(必要であれば、代わりにControlChooseIndexを使用してください)。
ChooseString → GuiControl.Choose(s)、ここでsは純粋な整数ではありません。|n
または||n
モードには対応していません(必要であれば、代わりにControlChooseStringを使用してください)。If the string matches multiple items in a multi-select ListBox, this method selects them all, not just the first.
Font → GuiControl.SetFont()
+/-Option → GuiControl.Opt("+/-Option")
Progress Guiコントロールは、デフォルトでPBS_SMOOTHスタイルを持たなくなり、システムのビジュアルスタイルに従ってスタイリングされるようになりました。
DPIが100 %以上の場合、デフォルトのマージンやコントロールサイズ(特にボタンコントロール)はv1と若干異なる場合があります。
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
は、より明確な目的を持つことができます:関数名の場合は、その関数の失敗を示します(関数の呼び出しやパラメータの評価に失敗したわけではありません)。What
は、式の評価と制御フローのエラーでは空白になる(他のものも空白になることがある)。
ランタイムエラーが投げる例外オブジェクトは、新しいErrorクラスまたはより具体的なサブクラスのインスタンスとして識別できるようになりました。エラーオブジェクトは、スタックトレースを含むStackプロパティを持ちます。Whatパラメータで実行中の関数名を指定した場合、Fileと Lineは、どの行からその関数が呼び出されたかに基づいて設定されるようになりました。
Try-catchの構文が変更され、スクリプトが特定のエラークラスをキャッチし、他のエラークラスをキャッチしないようにすることができるようになりました。詳しくは下記のCatchをご覧ください。
ほとんどの場合、エラーダイアログは、現在のスレッドを継続する(スレッドを終了する)オプションを提供するようになりました。COMエラーが発生した場合、続行しないことを選択するとスレッドが終了するようになりました(スクリプト全体が終了するのではありません)。
スクリプトはこれに依存しないようにしてください:エラーが組み込み関数によって発生した場合、その関数を継続すると""が返されます。式評価器でエラーが発生した場合(無効な動的参照やゼロ除算など)、式は中断され、""(制御フロー文のパラメータとして使用された場合)が出力されます。
コードが継続をサポートしていないケースもあり、継続の選択肢は表示しない方がよいでしょう。また、スクリプトを終了させるためのクリティカルエラーの場合は、このオプションは表示されません。
OnErrorコールバックは、以下の値のいずれかを含む第2パラメータを取るようになりました:
ErrorLevelは削除されました。スクリプトはエラーチェックをせずに書かれることが多いので(おそらく通常)、エラーにErrorLevelを設定する方針では、エラーが検出されないことがよくあります。すぐにエラーメッセージが表示されるのは、少し対立的に見えるかもしれませんが、一般的にはより有用です。
ErrorLevelがエラー状態を示すために設定されていた場合、代わりに例外がスローされ、(通常)より有益なエラーメッセージが表示されます。
"Process Exist"などのコマンドで値を返していたものが、単にその値を返す(例:pid := ProcessExist()
)か、もっと便利なもの(例:hwnd := GroupActivate(group)
)になりました。
ErrorLevelが二次的な戻り値として使用されるケースもあった。
これまでErrorLevelに失敗の回数を格納していたファイル関数は、投げられた例外オブジェクトのExtraプロパティにその回数を格納するようになりました。
SendMessageのタイムアウトは通常異常な状態であるため、TimeoutErrorが投げられる。TargetErrorおよびOSErrorは、他の条件下でもスローされることがある。
Run関数とHotkey関数のUseErrorLevelモードが削除されました。このモードは、言語にTry/Catchが追加される以前からありました。MenuとGuiにもこのモードがありましたが、オブジェクト(ErrorLevelを使用しない)に変更されました。
など、v1よりも多くのシンタックスエラーに対してロードタイムエラーが発生します:
x ()
x!
)以下のいずれかの失敗が発生した場合、例外が発生します(失敗を無視したり、空文字列を生成するのではありません):
(-1)**1.5
のような無効/非サポートな入力。なお、0**0や
a<<b
、a>>bの
ようにbが0.63の範囲にない場合は、新たに無効と判断される場合があります。fn(%empty%)
のように、空の名前でダブルデフを試みました。上記の条件の中には、v1では検出されるが、表現の途中では検出されないものがある。例えば、A_AhkPath := x
は、v1で検出されるが、y := x, A_AhkPath := x
は、v2でのみ検出されます。
演算子+=
,-=
,--
,++
を単独で使用しても、空の変数を 0 として扱わなくなりました。これは、v1とは異なり、空の変数を単独で使用した場合は0として扱い、式の途中や複数文のカンマを使用した場合は0として扱わないというものです。
関数は一般に、失敗すると例外を投げます。特に:
DllCall、RegExMatch、RegExReplaceの誤った使用によるエラーは、その複雑さゆえにかなり多く、(多くのエラーと同様に)エラーメッセージがすぐに表示されれば、検出やデバッグが容易になります。
数学関数は、入力が非数値の場合、または演算が無効な場合(ゼロ除算など)、例外を発生させます。
WinTitleパラメータを持つ関数(WinCloseのahk_groupモードなどの例外を除く)は、対象となるウィンドウまたはコントロールが見つからない場合にスローします。
以前は検出されなかったいくつかのエラーに対して例外がスローされ、(以前はErrorLevelの設定によって)誤ってエラーとしてマークされていたいくつかの条件が修正されました。
一部のエラーメッセージが変更されました。
Catchの構文が変更され、特定のエラークラスをキャッチする一方、他のエラークラスはキャッチしない(コールスタックのさらに上の別のCatchに制御を移す、またはエラーを報告してスレッドを終了する)方法が提供されました。これまでは、すべての型のスローされた値をキャッチし、型をチェックして再スローする必要がありました。事例:
; 古い(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 ; 新しい try SendMessage msg,,, "Control1", "The Window" catch TimeoutError MsgBox "The Window is unresponsive"
バリエーション:
catch
は、Errorインスタンスを捕捉します。catch as err
は、Errorインスタンスを捕捉し、errに代入されます。catch ValueError as err
は、ValueErrorインスタンスをキャッチし、errに代入します。catch ValueError, TypeError
は、他のタイプをキャッチします。catch ValueError, TypeError as err
どちらかの型を捕らえ、インスタンスを err に代入します。catch Any
は、何でもキャッチします。catch (MyError as err)
は、他の多くの制御フロー文と同様に、括弧を許可します。Tryが Finallyや Catchなしで使われた場合、空のブロックでCatchがあるかのように動作します。v1のようですが、現在Catch単体ではErrorのインスタンスしか捕捉しません。多くの場合、Try単体ではErrorを抑制するためのものなので、変更する必要はありません。However, the direct v2 equivalent of v1's try something()
is the following:
try something() catch Any {}
出力変数名よりもエラーの種類を優先することで、より良いコードを作ることができるかもしれません。期待されるエラーを意図通りに処理し、報告されるべき予期せぬエラーを抑制したり誤処理したりすることはありません。
すべての型の値が投げられるので、どのようなクラスでもフィルターとして有効です(例:String
や Map
)。ただし、クラスプロトタイプはロード時に解決されるため、任意の式ではなく完全なクラス名で指定する必要があります(class x extends y
のy
と同様)。
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内ではサポートされない。throw
は Catch文の本体に物理的に含まれる必要はなく、呼び出された関数が使用することができます。
最後のCatchの後にElseを置くことができる。これはTryの中で例外が投げられない場合に実行されます。
VKからSC、SCからVKへのマッピングがハードコードされることが少なくなり、理論上、従来とは異なるカスタムキーボードレイアウトとの互換性が向上しています。
キー名「Return」「Break」を削除しました。代わりに「Enter」「Pause」を使ってください。
キーボードレイアウトDLLからKLLF_ALTGRフラグを読み取ることで、各キーボードレイアウトにAltGrがあるかどうかを常に検出するようにしました。(v1.1.28+のUnicodeビルドでは既にこの方法が使われています。) キーボードフックでAltGrを検出するフォールバックメソッドは削除されました。
マウスホイールのホットキーで、A_EventInfoを120で割るのではなく、マウスドライバーから報告されたホイールデルタに設定します。一般的には120の倍数ですが、マウスのハードウェア/ドライバによっては、より高い解像度でホイールの動きを報告する場合があります。
ホットストリングで、Shift+Backspaceを Backspaceと同じように扱い、ホットストリングバッファ内で`b
に転写するようになりました。
ホットストリングは、複数のコロンの組が存在する場合、最後の組ではなく、最初の組のコロン(::
)を区切り文字として使用します。つまり、コロン(他のコロンに隣接する場合)は、v2ではトリガーテキストでエスケープする必要がありますが、v1では置換でエスケープする必要があります。なお、コロンが奇数個連続する場合、以前の動作では最後のコロンがペアの一部とみなされませんでした。例えば、::1:::2
(1
→ :2
)では動作に変化はありませんが、::3::::4
は 3::
→ 4
となるのではなく、 3
→::4
となっています。
ホットストリングは、ペアでコロンをエスケープすることはなくなりました。つまり、ホットストリングトリガーの最後に1つのコロンをエスケープすることが可能になりました。例えば、::5`:::6
はエラーではなく5:
→ 6
となり、::7`::::8
は 7::
→ 8
よりも 7:
→ :8
となっています。このような場合、混乱を避けるために、リテラルなコロンをすべてエスケープするのが最善です(ただし、孤立した1つのコロンはエスケープする必要はありません)。
継続セクションを持つホットストリングのデフォルトが、RawモードではなくTextモードになりました。
ホットキーが論理的に下にあり、ホットキーがWin/Altキーを必要とする場合のみ、リリース時にWin/Altキーをマスクするようになりました(#
/!
またはカスタム接頭辞付き)。つまり、Win/Altキーを必要としないホットキーは、Win/Altキーが物理的にダウンしているときにWin/Altアップをマスクすることはなくなりました。これにより、{Blind}{LWin up}
を送信するホットキーでスタートメニューを起動できるようになりました(AppsKey::RWin
などのリマップキーを使用すれば、すでに可能でした)。
Windows 2000とWindows XPのサポートは終了しました。
AutoHotkeyは、起動時にシステムのForegroundLockTimeout
設定を上書きしなくなりました。
SPI_SETFOREGROUNDLOCKTIMEOUT
アクションでSystemParametersInfo
を呼び出すことによって行われ、現在のユーザーセッションのすべてのアプリケーションに影響します。ログアウト後も持続しないが、それでも一部のユーザーには好ましくないものだった。SetForegroundWindow
の呼び出しは常に失敗し、WinActivateが採用する他の回避策は必要で、タイムアウトに関係なく有効でした。SPI_GETFOREGROUNDLOCKTIMEOUT
は、変更が有効になったかどうかを確認するために別のプロセスから使用されました(有効にならない場合もあります)。DllCall("SystemParametersInfo", "int", 0x2001, "int", 0, "ptr", 0, "int", 2)
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フォルダを探すために使用されます。
自動実行スレッドによって変更された設定は、100ミリ秒後に自動実行スレッドが終了したときに再び開始されるのではなく、その時点以降に起動されたスレッドの場合、すぐに既定の設定になります。
ダイナミックアロケーションを活用することで、以下の制限を解除しました:
ListVarsで、静的変数とローカル変数を分けて表示するようにしました。関数内で宣言されたグローバル変数も静的変数としてリストアップされます(これは新しい実装の詳細による副作用ですが、多くのグローバル変数を持つスクリプトで役に立つかもしれないので残してあります)。
コードサイズとメンテナンスコストを削減するために、(文書化されていない?) "lazy var" 最適化が削除されました。この最適化により、100,000以上の変数を持つスクリプトのパフォーマンスが改善されました。
トレイメニュー:「Pause Script」やメインウィンドウのメニューオプションとの整合性をとるため、「Reload This Script」「Edit This Script」から「This」という単語を削除しました。
YYYYMMDDHH24MISSタイムスタンプ値の長さが4~14の偶数でない場合、無効と判断されるようになりました(包括的)。
スクリプトは、以下の条件のうち少なくとも1つが満たされている間、「永続的」です:
Persistent()
またはPersistent(true)
が呼び出され、Persistent(false)
を呼び出しても元に戻らなかった場合。以下のいずれかが発生し、上記の条件が満たされない場合、スクリプトは終了します。
柔軟性を持たせるため、OnMessageはスクリプトを自動的に永続化させません。
これに対し、v1スクリプトは、以下のうち少なくとも1つが成立する場合に「永続的」であるとします:
スレッドは、15ミリ秒ではなく17ミリ秒の中断不能タイムアウトで始まります。システムのティックカウントは最小15または16のステップで更新されるため、15は低すぎます。つまり、ティックカウントが正確に間違ったタイミングで更新されると、実質的に時間が経過していないにもかかわらず、スレッドが中断される可能性があります。
スレッドが中断されずにスタートした場合、中断されないタイムアウトが先に切れても、少なくとも1行が実行されるまで中断されないようになりました(例えば、スレッドがスタートした直後に、他のプロセスにCPU時間を与えるために、システムがプロセスを中断した場合)。
#MaxThreadsと#MaxThreadsPerHotkeyは、最初の行が以下の関数のいずれかであるサブルーチンの例外を作らないようになりました:ExitApp、Pause、Edit、Reload、KeyHistory、ListLines、ListVars、ListHotkeys。
#SingleInstance Prompt
は、分かりやすくするためや、以前の指令を上書きするために、明示的に使用することができます。スクリプトファイルを指定せずにAutoHotkey32.exeやAutoHotkey64.exeなどの実行ファイルを起動しても、ユーザーのドキュメントフォルダーで既定のスクリプトファイルを検索することがなくなりました。
ポータブルコピーを使用する場合を除いて、AutoHotkeyは実行ファイルを直接起動して使用することを意図していません。通常、実行ファイルを起動する代わりに、拡張子が.ahkのファイルを実行します。
特定の実行ファイルへのショートカットを作成するときは、ショートカットのターゲットにスペースとスクリプトのパス(通常は引用符で囲まれています)を追加できます。
コマンドラインの引数は、番号付きグローバル変数の擬似配列に格納されなくなりました。代わりにグローバル変数A_Args(v1.1.27で追加)を使用する必要があります。
Rと/Fのスイッチは削除されました。代わりに/restartと/forceを使用してください。
関数ライブラリの自動インクルード機構が削除されたため、AutoHotkey.exeを使用してスクリプトの構文エラーをチェックする場合、/iLibの代わりに/validateを使用する必要があります。
以下のいずれかの場合、/ErrorStdOut は組み込みではなく、スクリプトのパラメータの1つとして扱われるようになりました:
=
で始まらないとき。従来は接尾辞は無視されていました。