レガシーシンタックスの廃止
リテラルの割り当てが廃止されました:
var = value
従来のIf文がすべて廃止され、
if expression
のみを残し、括弧を必要としません(ただし、あらゆる式と同様に括弧を使用できる)ようにしました。
"command syntax"の廃止。コマンドは存在せず、ただ
関数呼び出し文
があります。これは、括弧のない単なる関数やメソッドの呼び出しです。これは、以下を意味します:
以前のコマンドはすべて関数になりました(制御フロー文は除きます)。
戻り値が不要な場合は、すべての関数を括弧なしで呼び出すことができます(ただし、従来通り、式内の呼び出しでは括弧を省略できません)。
すべてのパラメータは式なので、すべてのテキストは「引用」され、カンマをエスケープする必要はありません。現在、一部のディレクティブ(コマンドでも関数でもない)を除いています。
パラメータは括弧の有無にかかわらず同じです。すなわち、戻り値の出力変数は存在しないので、括弧が省略された場合は廃棄されることになります。
通常の変数参照はパーセント記号で囲むことはありません(
#Include
と
#DllLoad
を除きます)。テキストに変数を含めるには、
連結
や
Format
を使用します。
関数とパラメータの間にコンマがあってはいけません。ただし、xを省略したときは
WinMove(, y)
=
WinMove , y
のようになります。わかりやすくするために、スペースまたはタブが必要です。一貫性を保つため、ディレクティブも新しい規約に従っています(ディレクティブ名とパラメータの間にコンマがあってはいけません)。
式を強制するためのパーセント-スペース接頭辞はありません。式中の引用符なしのパーセント記号は、二重参照/動的参照にのみ使用され、奇数個あると構文エラーになります。
メソッド呼び出し文(括弧を省略したメソッド呼び出し)は、
MyVar.MyProperty.MyMethod "String to pass"
のように、プレーン変数の後にドットで区切られた1つまたは複数の識別子を持つものに限定されます。
v1コマンドから関数への変換は概ね以下の通りです(ただし、一部の関数は後述するように変更されています):
コマンドの第1パラメータが出力変数で、第2パラメータが出力変数でない場合、そのパラメータは戻り値となり、パラメータリストから削除されます。
残りの出力変数は、書き込み可能な組み込み変数への参照を許可する以外は、
ByRefパラメータ
(使い方と構文が変更されている)と同様に扱われます。
ErrorLevelを設定する代わりに、失敗時に例外がスローされます。
以前はErrorLevelで返されていた値は、他の手段で返されるか、例外で置き換えられるか、優先されるか、単に返されないかであります。
以下に記す場合を除き、すべての制御フロー文は式も受け付けます。
パラメータを取るすべての制御フロー文(現在、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
などの機能でラベルが使用できなくなりました。
ローカル変数も戻り値もなく、独立した名前空間にある、基本的に限定的な関数の一種だったのです。関数は、これまでラベルサブルーチンが使われていた場所ならどこでも(
他の関数
の中でも)使うことができます。
機能は重複できません(ただし、機能内に含めることはできます)。その代わり、複数の機能を使い、他の機能から呼び出すようにします。A_ThisLabelの代わりに、関数パラメータを使用します。
サブルーチンとは異なり、関数の
終わり
を定義し忘れると、
{
には、それぞれ対応する
}
が必要なので、通常、エラーになります。また、ラベルサブルーチンよりも関数の方が境界を特定しやすい場合もあります。
関数を自動実行部に割り込ませることなく配置することができます。自動実行セクションは、スクリプト全体を容易にカバーできるようになったので、
自動実行スレッド
内で実行される
グローバルコード
と呼ばれることもあります。
関数は、"goto"(ユーザーがループするために現在のサブルーチンをgosubすることで、必然的にスタックスペースを使い果たしてプログラムを終了させること)として悪用される可能性が少し低くなるかもしれません。
(
Hotkey
のように)ラベルや機能を受け入れる機能がなく、同じ名前で両方が同時に存在できるため、あいまいさが少なくなります。
ラベルの残りのすべての用途において、関数内部からグローバルラベルを参照することは無効です。そのため、ラベル検索をローカルラベルリストに限定することができます。そのため、(これまでサポートされていなかった)関数内部から外部への無効なジャンプをチェックする必要がありません。
ホットキーとホットストリングラベル
ホットキー
や自動置換でない
ホットストリング
は、ラベルではなくなり、代わりに(自動的に)機能を定義するようになりました。複数行のホットキーの場合、
return
で終了させるのではなく、中括弧を使ってホットキーの本体を囲みます(終了中括弧はこれを意味します)。ホットキーを明示的に呼び出すには、
::
と
{
の間に
funcName(ThisHotkey)
を指定します - これは v1.1.20+ でも行えますが、現在はパラメータがあります。関数定義が明示されていない場合、パラメータはThisHotkeyと命名されます。
注:
ホットキー関数はデフォルトで
assume-local
であるため、宣言なしで
グローバル変数
に代入することはできません。
関数名と変数名が共有名前空間に配置されるようになりました。
各関数定義は、現在のスコープ内に定数(読み取り専用変数)を作成します。
Func("MyFunc")
の代わりに
MyFunc
を使用します。
SetTimer
や
Hotkey
などの組み込み関数に渡す場合は、
MyFunc
の代わりに
"MyFunc"
を使用してください。名前(文字列)の受け渡しはサポートされなくなりました。
関数を値で呼び出す場合、
%myVar%()
の代わりに
myVar()
を使用します。
関数名(文字列)しかないときに関数を呼び出すには、まず
double-deref
で名前を変数に解決し、その値(関数オブジェクト)を取得します。
%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回目に到達したときには何の効果もありません。複数の宣言を行うことができ、同じ変数に対して異なるタイミングで実行することができます。メリットは複数あります:
静的イニシャライザが静的変数を持つ他の関数を呼び出す場合、関数定義の順序によりイニシャライザが未実行となる危険性が少ないです。
Because the function has been called, parameters,
A_ThisFunc
and
closures
are available (they previously were not).
静的変数は条件付きで初期化できるため柔軟性があり、しかも
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つの文字列を連結しても、データが切り捨てられることがなくなりました。
バイナリデータの比較には、大文字と小文字を区別する等号演算子(
==
と
!==
)が使えます。他の比較演算子は、最初の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
が正の場合、以前は内部で浮動小数点演算を使用していたため精度が落ちていましたが、範囲内であればすべての入力に対して正しい結果を与えるようになりました。オーバーフロー時の動作は未定義です。
Objects (Misc)
こちらも参照のこと:
オブジェクト
.
でアクセスするプロパティと、
[]
でアクセスするデータ(アイテム、配列、マップ要素)は区別されるようになりました。例えば、
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
など)を取得または設定する事前定義プロパティです。予約ではなく、通常のプロパティ名です。
スーパークラスに x の定義がない場合に
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
の値を返すようになりました。プロパティセッターの戻り値は無視されるようになりました。以前:
組み込みオブジェクトの中には
z
を返すもの、
x.y
を返すもの(
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パラメータは、ByRef param
の代わりに¶m
を使用して宣言されるようになり、使い方に若干の違いがあります。
ByRefパラメータが暗黙のうちに呼び出し元の変数への参照を取ることはなくなりました。その代わり、呼び出し側は参照演算子(&var
)を使って明示的に参照を渡す必要があります。これにより、参照を別の場所に保存し、可変長引数関数で受け入れ、可変長引数コールで渡すなど、より柔軟な対応が可能になります。
パラメータがByRefとマークされている場合、VarRef以外の値を明示的に渡そうとすると、エラーが発生します。それ以外の場合は,param is VarRef
で参照を確認し,IsSetRef(param)
で対象の変数に値があるかどうかを確認し,%param%
で明示的に参照解除することができます。
ByRefパラメータは、同じ関数が再帰的に呼び出されたときに、前のインスタンスからローカル変数への参照を受け取ることができるようになりました。
ネストされた関数
ある関数は、別の関数の内部で定義することができます。ネストされた関数は、(適切な条件下で)包含関数から非静的ローカル変数を自動的に「捕捉」し、包含関数が戻った後に使用できるようにすることができます。
また、新しい"太矢印"=>
演算子を使って、ネストした関数を作成することができます。
詳しくは、「ネストされた関数」をご覧ください。
未分類(Uncategorized)
宣言された変数やオプションのパラメータを初期化する場合は、=
の代わりに:=
を使用する必要があります。
return %var%
が二重参照になりました。以前はreturn var
と同等でした。
#Includeは、デフォルトでカレントファイルを含むディレクトリからの相対パスとなります。そのパラメータは、オプションで引用符で囲むことができるようになりました。
#ErrorStdOutのパラメータを引用符で囲むことができるようになりました(オプション)。
ラベル名は、文字、数字、アンダースコア、非ASCII文字(変数、関数などと同じ)のみで構成することが求められるようになりました。
関数内で定義されたラベルはローカルスコープを持ち、その関数内でのみ表示され、他の場所で定義されたラベルと衝突することはありません。ローカルラベルを外部から(組み込み関数でも)呼び出すことはできません。代わりにネストされた関数を使用することで、ローカル変数を完全に使用することができます。
for k, v in obj
:
オブジェクトの呼び出し方が変わりました。See Enumeration further below.
k and v are now restored to the values they had before the loop began, after the loop breaks or completes.
objがオブジェクトでない場合、またはその列挙体の取得や呼び出しに問題がある場合は、例外が発生します。
最大19個の変数を使用することができます。
変数は省略可能です。
コンマのエスケープには、もはや何の意味もありません。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 と関連付けられる。
; 条件が偽の場合に実行されるステートメント
賢い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を削除しました。
ObjGetCapacityと ObjSetCapacityは、プロパティを含むオブジェクトの容量にのみ影響するようになり、一般的に使用されることはないと予想されます。プロパティ、配列要素、マップ要素の文字列バッファの容量設定には対応していません。バイナリデータの場合は、Bufferオブジェクトを使用してください。
ArrayとMapには、オブジェクトの現在の配列またはマップの割り当てに対応するCapacityプロパティがあります。
その他、冗長な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()
を呼び出すことができます。
定義されている場合、デフォルトの動作を行わなければならりません。例えば、__setが値を保存しない場合、その値は保存されることはありません。
メソッドが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 は、そのクラスで定義されているか、スーパークラスから継承されている場合、各クラスの初期化時に呼び出されます。詳しくは、静的/クラス変数(上)、および、クラスの初期化をご覧ください。
Array
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オブジェクトに似た機能を持つ連想配列ですが、より曖昧さがありません。
Cloneは従来通り使用します。
Deleteは、一度に1つのキーしか削除できません。
HasKeyはHasに名称変更されました。
Countがプロパティになりました。
新しいプロパティ:Capacity、CaseSense
新しい手法:Get、Set、Clear
文字列のキーはデフォルトで大文字と小文字が区別され、Integerに変換されることはありません。
現在、Floatキーは文字列に変換されたままです。
a.b
はプロパティを、a["b"]
は要素を意味します。v1とは異なり、配列の要素を代入することで誤ってプロパティやメソッドを無効化することはできません。
マップにDefaultプロパティが定義されていない限り、存在しない要素の値を取得しようとすると例外がスローされます。MapObj.Get(key, default)
は、各リクエストに対して明示的にデフォルト値を提供するために使用することができます。
キーと値のペアのリストからマップを作成するには、Map(Key, Value, ...)
を使用します。
列挙者モデルの変更:
NewEnum()を__Enum(n)に置き換えました。
必須パラメータnには、forループの変数数が含まれており、最初の反復呼び出しまで初期化を延期することなく、列挙に影響を与えることができます。
Next()をCall()に置き換え、ByRefが異なる動作をする以外は同じ使い方をします。例えば、Call(&a)
として定義されたメソッドはa := next_value
を代入する必要がありますが、Call(a)
はVarRefを受け取るので%a% := next_value
を代入すべきです。
__Enumが存在しない場合、オブジェクトは列挙者であるとみなされます。これにより、関数オブジェクト(クロージャなど)を直接使用することができます。
配列要素とプロパティが分離されたため、プロパティの列挙には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つの用途があります:
オブジェクトの値です。例えば、VBScriptでは、MsgBox obj
は、そのデフォルトのメンバーを呼び出すことによって、オブジェクトを評価します。
コレクションのインデックス付きプロパティで、通常はItemまたはitemと名付けられます。
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
のように代入することもできるようになりました。
ライブラリ
Asc()(Ord使用)
AutoTrim(Trim使用)
ComObjMissing()(代わりに2つの連続したカンマを書きます)
ComObjUnwrap()(代わりにComObjValueを使用し、必要に応じてObjAddRefを使用)
ComObjEnwrap()(代わりにComObjFromPtrを使用し、必要に応じてObjAddRefを使用)
ComObjError()
ComObjXXX() ここで、XXXは明示的に定義されたComObj関数以外のものです(代わりにComObjActive、ComValue、ComObjFromPtrを使用してください)。
ControlSendRaw (代わりにControlSend "{Raw}"
またはControlSendTextを使用します)
EnvDiv
EnvMult
EnvUpdate(有用性は非常に低く、単純なSendMessageに置き換えることができます)
Exception(Errorまたは適切なサブクラスを使用)
FileReadLine(ファイル読み込みループまたはFileOpenを使用します)
Func(MyFunc
のように直接参照を使用します)
Gosub
Gui、GuiControl、GuiControlGet(Guiの項参照)
IfEqual
IfExist
IfGreater
IfGreaterOrEqual
IfInString
IfLess
IfLessOrEqual
IfMsgBox(MsgBoxはボタン名を返すようになりました)
IfNotEqual
IfNotExist
IfNotInString
IfWinActive
IfWinExist
IfWinNotActive
IfWinNotExist
If between/is/in/contains(ただし、isXXXを参照)
Input(InputHookを使用)
IsByRef (see ByRef limitations)
IsFunc
Menu(Menu/MenuBarクラス、TraySetIcon、A_IconTip、A_IconHidden、A_AllowMainWindowを使用します)
MenuGetHandle(Menu.Handleを使用します)
MenuGetName(メニュー名がないため、MenuFromHandleが最も近い代替となる)
Progress (Guiを使用)
SendRaw (代わりにSend "{Raw}"
またはSendTextを使用します)
SetBatchLines(-1がデフォルトの動作になりました)
SetEnv
SetFormat(Formatは文字列の書式設定に使用できます)
SoundGet/SoundSet(Sound関数参照)
SoundGetWaveVolume/SoundSetWaveVolume(バランスに関してSoundGet/SoundSetと若干異なる動作をするが、どちらもバランスは保たれない)
SplashImage(Guiを使用)
SplashTextOn/Off(Guiを使用)
StringCaseSense(各種パラメータを使用)
StringGetPos(InStrを使用)
StringLeft
StringLen
StringMid
StringRight
StringTrimLeft
StringTrimRight -- これらのコマンドの代わりにSubStrを使用します。
StringReplace(代わりにStrReplaceを使用します)
StringSplit(代わりにStrSplitを使用します)
Transform
VarSetCapacity (バイナリデータ/構造体にはBufferオブジェクトを、UTF-16文字列にはVarSetStrCapacityを使用します)
WinGetActiveStats
WinGetActiveTitle
#CommentFlag
#Delimiter
#DerefChar
#EscapeChar
#HotkeyInterval(A_HotkeyIntervalを使用)
#HotkeyModifierTimeout(A_HotkeyModifierTimeoutを使用)
#IfWinActive、#IfWinExist、#IfWinNotActive、#IfWinNotExist(#HotIf Optimization参照)
#InstallKeybdHook(InstallKeybdHook関数を使用)
#InstallMouseHook(InstallMouseHook関数を使用)
#KeyHistory (KeyHistory N
を使用します)
#LTrim
#MaxHotkeysPerInterval (A_MaxHotkeysPerIntervalを使用します)
#MaxMem(各変数の最大容量が無制限になりました)
#MenuMaskKey (A_MenuMaskKeyを使用します)
#NoEnv(現在のデフォルトの動作)
ComObjCreate() → ComObjectであり、今はクラスになっています
ComObjParameter() → ComValueであり、現在はクラスになっています
DriveSpaceFree → DriveGetSpaceFree
EnvAdd → DateAdd
EnvSub → DateDiff
FileCopyDir → DirCopy
FileCreateDir → DirCreate
FileMoveDir → DirMove
FileRemoveDir → DirDelete
FileSelectFile → FileSelect
FileSelectFolder → DirSelect
#If → #HotIf
#IfTimeout → HotIfTimeout
StringLower → StrLower および StrTitle
StringUpper → StrUpper および StrTitle
UrlDownloadToFile → Download
WinMenuSelectItem → MenuSelect
LV, TV and SB functions → methods of GuiControl
File.__Handle → File.Handle
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は、待ち時間が終了した場合は0 (false)を、そうでない場合は1 (true)を返すようになりました。ErrorLevelを削除しました。0を指定しても、0.5を指定したのと同じではなく、最短の待ち時間が発生するようになりました。
ComObj()
:この機能は、ワイルドカードのような名前で、さまざまな接尾辞をつけることができました。ComObjActive(CLSID)
,ComObjParameter(vt, value)
,ComObjEnwrap(dsp)
のように、特定の種類のパラメータでよく使われる名前もありました。その代わり、関数やクラスが別々になり、ワイルドカードの名前もなくなりました。詳細は「COMオブジェクト(ComObject)」を参照してください。
Control:Control関数、SendMessageとPostMessageで使用されるControlパラメータにいくつかの変更が加えられました:
HWND(純粋な整数でなければならない)またはGuiControlオブジェクトのようなHwndプロパティを持つオブジェクトを受け取ることができるようになりました。HWNDはコントロールやトップレベルのウィンドウを識別することができますが、後者は通常、一部の機能でしか意味を持ちません(下記参照)。
ただし、トップレベルウィンドウを操作できる関数(ControlSend[Text]、ControlClick、SendMessage、PostMessage)、または他のオプションパラメータが先行する場合(ListViewGetContent、ControlGetPos、ControlMove)は除きます。
省略された場合、代わりにターゲットウィンドウが使用されます。これは、以前のSendMessage/PostMessageの動作と一致し、ControlSendで以前使用されていたahk_parent
特殊値を置き換えます。
空白の値は無効です。関数のデフォルトがターゲットウィンドウの最上位コントロールになることはありません。
ControlGetFocusは、ClassNNの代わりにコントロールのHWNDを返すようになり、ウィンドウにフォーカスされたコントロールがないことを正常に判断した場合、エラーがあると見なされなくなりました。
ControlMove、ControlGetPos、ControlClickで、ウィンドウ座標の代わりにクライアント座標(GuiControlのような)を使用するようになりました。クライアント座標は、ウィンドウのタイトルバーとボーダーを除いたクライアント領域の左上からの相対値です。(コントロールはクライアントエリア内でのみレンダリングされます。)
ControlMove、ControlSend、ControlSetTextは、他のControl関数と同様にパラメータの順序を使用するようになりました。つまり、Control、WinTitle、WinText、ExcludeTitle、ExcludeTextは、常に一緒に(パラメータリストの最後に)まとめられ、記憶しやすくなっています。
すべてのモードは何かに対して相対的であるため、CoordModeはモードとして "Relative"を受け付けなくなりました。"Window"と同義語だったので、代わりにそちらを使ってください。
DllCall:後述のDllCallの項を参照。
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システム ホットキーとタスク バーに近い方法でウィンドウが選択されるようになりました。具体的には以下です:
所有するウィンドウは評価対象外です。オーナーウィンドウが適格(グループと一致しない)である場合、オーナーウィンドウまたはその所有ウィンドウのいずれか、最後にアクティブだった方をアクティブにします。グループメンバーが所有するウィンドウはアクティブにならなくなりますが、所有するウィンドウ自体をグループに追加しても効果はありません。(以前の動作は、所有するすべてのウィンドウを循環させ、所有者を起動させることはありませんでした。)
無効化されたウィンドウは、その所有するウィンドウがそれよりも最近アクティブであった場合を除き、スキップされます。
WS_EX_NOACTIVATE スタイルを持つウィンドウは、おそらくアクティベートされることを想定していないため、スキップされます。また、Alt+EscとAlt+Shift+Escのシステムホットキーでもスキップされます。
WS_EX_TOOLWINDOW を持ち、WS_EX_APPWINDOW を持たないウィンドウは、タスクバーと Alt-Tab から省略され、スキップされます。
ホットキーのデフォルトが、スクリプトの一番下の#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)
を使用します。
なお、StartingPosが-1の場合は、v2の最後の文字であり、v1の2番目の最後の文字であることを意味します。上の例がv1(v2.0-a033~v2.0-a136ではなく)のものであれば、新しいコードは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は、オペレーティングシステムの乱数発生器を利用し、いくつかの制限を解除し、より便利に使用できるように改良されました。
符号付き整数値の64ビット全範囲をサポートするようになりました(32ビットから増加)。
浮動小数点数は、32ビット乱数ではなく53ビット乱数から生成され、Min以上Max未満でなければなりません(ただし、浮動小数点数の丸め誤差により、理論上はMaxと等しくなる場合があります)。
パラメータはすでに任意の順序で指定することができましたが、最初のパラメータだけを指定すると、他のバウンドが2147483647ではなく0にデフォルト設定されるようになりました。例えば、Random(9)
は0から9の間の数を返します。
両パラメータを省略した場合、戻り値は0~2147483647の整数ではなく、0.0(包含)~1.0(概ね排他)の浮動小数点数です。
乱数生成器の種付けはシステムが自動的に行い、手動で種付けする方法は提供しないため、NewSeedパラメータに代わるものはない。
RegExMatchのオプションOとPが削除され、O(オブジェクト)モードが必須となりました。RegExMatch オブジェクトが列挙型(forループ)に対応しました。マッチオブジェクトの構文が変更されました:
__Getは、match.subpat
(subpatはサブパターン/キャプチャグループの名前)という省略法を実装するために使用されます。プロパティが継承されている場合、__Getが呼び出されなくなったため、以下のサブパターン名は省略構文で使用できなくなりました:Pos、Len、Name、Count、Mark。(例えば、match.Len
は常にマッチ全体の長さを返し、キャプチャした文字列は返しません。)
元々、マッチオブジェクトはプロパティの代わりにメソッドを持ち、プロパティはサブパターン名のために予約できるようになっていました。新しい言語の動作では、match.name
はデフォルトで関数を返すことになるため、メソッドはプロパティに置き換えられ、または補完されました:
Pos、Len、Nameがプロパティとメソッドになりました。
Nameは混乱を避けるため、1つのパラメータを必要とするようになりました(match.Name
はエラーを投げます)。
カウントとマークはプロパティのみとなりました。
Valueは削除されました。match.Value()
の代わりにmatch.0
またはmatch[]
を、match.Value(N)
の代わりにmatch[N]
を使ってください。
RegisterCallbackはCallbackCreateに名称変更し、クロージャをより活用できるように変更しました:
関数オブジェクトをサポートするようになりました(関数名はサポートしなくなりました)。
EventInfoパラメータを削除しました(代わりにクロージャまたはバウンド関数を使用します)。
可変型コールバック関数の特殊な挙動を削除し、&
オプション(パラメータリストのアドレスを渡す)を追加しました。
コールバックメモリを解放し、関連する関数オブジェクトを解放するための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に統合されているので注意してください)。以前は以下のように振る舞っていました:
RegReadは、親キーにサブキーが存在する場合、そのサブキーと同じ名前の値を読み取ります。
RegWriteはエラーを返しました。
RegDeleteでサブキーが削除されました。
RegDelete、RegRead、RegWriteで、KeyNameが省略されている場合にValueNameを指定できるようになりました:
現在のループREG項目がサブキーの場合、ValueNameのデフォルトは空(サブキーのデフォルト値)、ValueTypeの指定が必要です。
現在のループREGアイテムが値の場合、ValueNameと ValueTypeのデフォルトはその値の名前と型であるが、一方または両方をオーバーライドすることができる。
それ以外の場合、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は、以下の変更を受けました:
VarNameパラメータは、柔軟性を持たせるために、入出力パラメータに分割されました。使い方は、Output := Sort(Input [, Options, Callback])
になりました。
また、2つの項目が同数である場合、自動的に元の項目の順番がタイブレーカーとして使用され、より安定した結果が得られるようになりました。
C
オプションで、他の関数(CL
以外)のCaseSenseパラメータと同等の接尾辞を受け付けるようになりました:CLocale CLogical COn C1 COff C0
。特に、「論理」比較モードのサポートが新しくなりました。
Sound関数:SoundGetとSoundSetは、Vista+のサウンドAPIの機能によりマッチするように改訂され、XPのサポートを取りやめました。
サポートされていないコントロールタイプを削除しました。
レガシーミキサーコンポーネントタイプを削除しました。
コンポーネントを名前とインデックスで参照できるようにします。
デバイスは、ネームプレフィックスやインデックスで参照できるようにします。
ボリュームとミュートの機能に分割。
デバイス名やコンポーネント名を取得するためのSoundGetNameを追加しました。
COMインターフェースを取得するためのSoundGetInterfaceを追加しました。
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を返すようになり、式でより便利になりました。
#UseHookと #MaxThreadsBufferは 1
、0
、True
、False
を許可します。(他と違い、実際には表現に対応していません。)
ListLines allows omitted or boolean.
ControlSetChecked、ControlSetEnabled、Pause、Suspend、WinSetAlwaysOnTop、WinSetEnabledでは、1
、0
、-1
が可能です。
A_DetectHiddenWindows、A_DetectHiddenText、A_StoreCapsLockModeは、booleanを使用します(対応する関数も同様です)。
以下の関数は、16進数文字列の代わりに純粋な整数を返します:
ControlGetExStyle
ControlGetHwnd
ControlGetStyle
MouseGetPos
WinActive
WinExist
WinGetID
WinGetIDLast
WinGetList(配列内)
WinGetStyle
WinGetStyleEx
WinGetControlsHwnd(配列内)
A_ScriptHwndも、純粋な整数を返します。
DllCall
型パラメータが変数である場合、その変数の内容が常に使用され、その名前は使用されます。つまり、引用符で囲まれていない型名はサポートされなくなり、型名は引用符で囲む必要があります。
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のプロパティを持つオブジェクトです。
MsgBox
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
など)、またはスラッシュなしのイニシャルのみです。
任意の数値、v1 と同じ。数値は文字列オプションと組み合わせることができ、オプションは純粋な整数とすることができます。
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のサブコマンドは個別の機能に置き換えられ、メインコマンドは削除されました。一部の機能については、名称および使用方法を変更しています。新しい使い方は以下の通りです:
; ここで、...はオプションの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は仮想変数ではない。
数値を返す組み込み変数が、文字列ではなく、整数で返すようになりました。
A_LoopFileFullPath →A_LoopFilePath(Loopのパラメータが相対パスだった場合、相対パスを返すので、「フルパス」は誤解を招きます)
A_LoopFileLongPath → A_LoopFileFullPath
Clipboard → A_Clipboard
ClipboardAll(ClipboardAll関数に置き換えます)
ComSpec(A_ComSpecを使用します)
ProgramFiles(A_ProgramFilesを使用します)
A_AutoTrim
A_BatchLines
A_CaretX、A_CaretY(CaretGetPosを使用します)
A_DefaultGui、A_DefaultListView、A_DefaultTreeView
A_ExitReason
A_FormatFloat
A_FormatInteger
A_Gui、A_GuiControl、A_GuiControlEvent、A_GuiEvent、A_GuiX、A_GuiY、A_GuiWidth、A_GuiHeight(すべてイベントハンドラのパラメータに置き換えます)
A_IPAddress1、A_IPAddress2、A_IPAddress3、A_IPAddress4(SysGetIPAddressesを使用します)
A_IsUnicode(v2 は常に Unicode です。StrLen(Chr(0xFFFF))
で置き換えるか、global A_IsUnicode := 1
で再定義できます)
A_StringCaseSense
A_ThisLabel
A_ThisMenu、A_ThisMenuItem、A_ThisMenuItemPos(メニューアイテムコールバックのパラメータを使用します)
A_LoopRegSubKey(A_LoopRegKeyにルートキーとサブキーが含まれるようになりました)
真と偽(まだ存在しますが、現在はキーワードのみで、変数ではありません)
A_AllowMainWindow(読み書き可能。「Menu Tray、MainWindow/NoMainWindow」を置換)
A_HotkeyInterval(#HotkeyIntervalを置換)
A_HotkeyModifierTimeout(#HotkeyModifierTimeoutを置換)
A_InitialWorkingDir(以下の「初期設定」を参照)
A_MaxHotkeysPerInterval(#MaxHotkeysPerIntervalを置き換えます)
A_MenuMaskKey(#MenuMaskKeyを置き換える)
以下の組み込み変数に値を割り当てることができます:
A_ControlDelay
A_CoordMode..
A_DefaultMouseSpeed
A_DetectHiddenText(また、"On "または "Off "ではなく、1または0を返すようになりました)
A_DetectHiddenWindows(また、"On "または "Off "ではなく、1または0を返すようになりました)
A_EventInfo
A_FileEncoding(また、""の代わりに "CP0"を返すようになり、割り当て時に "CP"のプレフィックスを省略することができるようになりました)
A_IconHidden
A_IconTip(また、ツールチップがデフォルトまたは空であっても、常に反映されるようになりました)
A_Index:カウントループの場合、この値を変更すると、何回繰り返し実行されるかに影響します。(組み込み変数のグローバルな性質は、Enumerator関数がForループで見るべきインデックスを設定できることを意味します。)
A_KeyDelay
A_KeyDelayPlay
A_KeyDuration
A_KeyDurationPlay
A_LastError:Win32 SetLastError()関数を呼び出します。また、符号なし値を返すようになりました。
A_ListLines
A_MouseDelay
A_MouseDelayPlay
A_RegView
A_ScriptName:デフォルトのダイアログのタイトルを変更します。
A_SendLevel
A_SendMode
A_StoreCapsLockMode(また、"On" または "Off" の代わりに 1 または 0 を返すようになりました)
A_TitleMatchMode
A_TitleMatchModeSpeed
A_WinDelay
A_WorkingDir:SetWorkingDirを呼び出すのと同じです。
組込オブジェクト
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サブコマンド
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
Control Options
+/-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
空のサブコマンド
GuiControlGetの空サブコマンドには2つのモードがありました:というデフォルトのモードと、4番目のパラメータがText
という単語であるテキストモードがあります。コントロールタイプに単一の「値」がない場合、GuiControlGetはGetWindowTextの結果を返すのがデフォルトでした(これは必ずしも可視テキストではありません)。コントロールによっては、テキストが表示されていなかったり、テキストの取得をサポートしていなかったりするため、4番目のパラメータを完全に無視することができました。一方、GuiControl.Textは、表示テキスト、非表示テキスト(ControlGetTextが返すテキストと同じ)、または全く何も返しません。
下の表は、GuiControlGetの各モードとコントロールタイプに最も近い同等のプロパティまたは関数を示しています。
コントロールデフォルトテキスト注釈
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
Picture.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は毎回同じオブジェクトを返しますが、GuiControlGetは毎回新しいラッパーオブジェクトを作成しました。その結果、ComObjConnectの接続を維持するためにActiveXオブジェクトへの参照を保持する必要がなくなりました。
その他のサブコマンド
Pos → GuiControl.GetPos()
Focus→Gui.FocusedCtrl、ClassNNの代わりにGuiControlオブジェクトを返します。
FocusV → GuiObj.FocusedCtrl.Name
Hwnd → GuiControl.Hwnd、16進数の文字列ではなく、純粋な整数を返します。
Enabled/Visible/Name → 同名のGuiCtrlプロパティ。
GuiControl
(ブランク)およびテキストサブコマンド
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パラメータを取るようになりました:
Return:-1を返すとスレッドを継続し、0と1は以前のように動作します。
Exit:コンティニュアスには対応していません。ゼロ以外を返すと、それ以降の処理は停止するが、スレッドは終了します。
ExitApp:これは致命的なエラーです。ゼロ以外を返すと、それ以降の処理は停止するが、スクリプトは終了します。
エラーレベル
ErrorLevelは削除されました。スクリプトはエラーチェックをせずに書かれることが多いので(おそらく通常)、エラーにErrorLevelを設定する方針では、エラーが検出されないことがよくあります。すぐにエラーメッセージが表示されるのは、少し対立的に見えるかもしれませんが、一般的にはより有用です。
ErrorLevelがエラー状態を示すために設定されていた場合、代わりに例外がスローされ、(通常)より有益なエラーメッセージが表示されます。
"Process Exist"などのコマンドで値を返していたものが、単にその値を返す(例:pid := ProcessExist()
)か、もっと便利なもの(例:hwnd := GroupActivate(group)
)になりました。
ErrorLevelが二次的な戻り値として使用されるケースもあった。
Uオプションによるソートで、重複を除去した数を返さないようになりました。
The Input command was removed. InputHookに取って代わられました。数行のコードで、ErrorLevelとOutputVarを使用する代わりに、結果を含むInputHookオブジェクトを返す簡単な置換を行うことができます。
InputBoxは、Result(OK、Cancel、Timeout)およびValueのプロパティを持つオブジェクトを返します。
これまでErrorLevelに失敗の回数を格納していたファイル関数は、投げられた例外オブジェクトのExtraプロパティにその回数を格納するようになりました。
SendMessageのタイムアウトは通常異常な状態であるため、TimeoutErrorが投げられる。TargetErrorおよびOSErrorは、他の条件下でもスローされることがある。
Run関数とHotkey関数のUseErrorLevelモードが削除されました。このモードは、言語にTry/Catchが追加される以前からありました。MenuとGuiにもこのモードがありましたが、オブジェクト(ErrorLevelを使用しない)に変更されました。
など、v1よりも多くのシンタックスエラーに対してロードタイムエラーが発生します:
空白の括弧(関数名に隣接する場合を除きます)、例:x ()
間違った側で使用された、またはオペランドを欠いているプリフィックス演算子(例:x!
)
オペランドが2つ以下の二項演算子。
オペランドが3つ以下の三項演算子。
代入対象が書き込み可能な変数やプロパティではありません。
以下のいずれかの失敗が発生した場合、例外が発生します(失敗を無視したり、空文字列を生成するのではありません):
数値以外の値で計算を試みます。(数値文字列でも可。)
ゼロで割る、または(-1)**1.5
のような無効/非サポートな入力。なお、0**0や
a<<b
、a>>bの
ようにbが0.63の範囲にない場合は、新たに無効と判断される場合があります。
組み込み関数の戻り値、連結、または式の結果のためのメモリ割り当てに失敗します。
スタックアンダーフロー(通常、構文エラーによって引き起こされる)。
変数(または配列要素)でないものに代入しようとしましたた。
読み取り専用変数への代入を試みた。
fn(%empty%)
のように、空の名前でダブルデフを試みました。
動的な関数呼び出しやメソッド呼び出しの実行に失敗した場合。
値がそのメソッド/プロパティを実装していないため、メソッド/プロパティの呼び出しに失敗します。(v1の連想配列の場合、メソッド呼び出しでのみ発生します。)
メモリ割り当ての失敗により、オブジェクト割り当てに失敗しました。
上記の条件の中には、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の構文が変更され、特定のエラークラスをキャッチする一方、他のエラークラスはキャッチしない(コールスタックのさらに上の別のCatchに制御を移す、またはエラーを報告してスレッドを終了する)方法が提供されました。これまでは、すべての型のスローされた値をキャッチし、型をチェックして再スローする必要がありました。事例:
; 古い(v1には「is」やErrorクラスがないため、古い v2.0-a のルールを使ってデモを行う)
SendMessage msg,,, "Control1", "The Window"
catch err
if err is TimeoutError
MsgBox "The Window is unresponsive"
throw err
; 新しい
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
を呼び出すことによって行われ、現在のユーザーセッションのすべてのアプリケーションに影響します。ログアウト後も持続しないが、それでも一部のユーザーには好ましくないものだった。
ユーザーのバグ報告(と単純な論理)によると、もしそれが機能すれば、特に設計されていないプログラムによってフォーカスを盗まれることが可能になるそうです。
Windows10でテストしたところ、何の効果もないことがわかりました。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ミリ秒後に自動実行スレッドが終了したときに再び開始されるのではなく、その時点以降に起動されたスレッドの場合、すぐに既定の設定になります。
ダイナミックアロケーションを活用することで、以下の制限を解除しました:
行または継続部分の最大長は16,383文字です。
1つの表現につき、最大512個のトークンを使用します(MAX_TOKENS)。
MAX_TOKENSに基づいてサイズ設定されていた式評価器内部の配列は、必要なサイズの事前計算に基づいて設定されるようになったため、パフォーマンスはほぼ同じですが、ほとんどの場合、スタック使用量は多少少なくなります。これにより、ユーザー定義関数の最大再帰深度が増加する可能性があります。
1つのargにつき、最大512個のvarまたは関数参照(ただし、MAX_TOKENSはとにかく式に対してより制限的であった)。
関数呼び出しごとに最大255個の指定パラメータ値(ただし、いずれにせよMAX_TOKENSの方がより制限的でした)。
ListVarsで、静的変数とローカル変数を分けて表示するようにしました。関数内で宣言されたグローバル変数も静的変数としてリストアップされます(これは新しい実装の詳細による副作用ですが、多くのグローバル変数を持つスクリプトで役に立つかもしれないので残してあります)。
コードサイズとメンテナンスコストを削減するために、(文書化されていない?) "lazy var" 最適化が削除されました。この最適化により、100,000以上の変数を持つスクリプトのパフォーマンスが改善されました。
トレイメニュー:「Pause Script」やメインウィンドウのメニューオプションとの整合性をとるため、「Reload This Script」「Edit This Script」から「This」という単語を削除しました。
YYYYMMDDHH24MISSタイムスタンプ値の長さが4~14の偶数でない場合、無効と判断されるようになりました(包括的)。
スクリプトは、以下の条件のうち少なくとも1つが満たされている間、「永続的」です:
スクリプトで少なくとも1つのホットキーまたはホットストリングが定義されています。
少なくとも1つのGui(またはスクリプトのメインウィンドウ)が表示されています。
少なくとも1つのスクリプトタイマーが現在有効になっています。
少なくとも1つのOnClipboardChangeコールバック関数が設定されています。
少なくとも1つのInputHookがアクティブです。
Persistent()
またはPersistent(true)
が呼び出され、Persistent(false)
を呼び出しても元に戻らなかった場合。
以下のいずれかが発生し、上記の条件が満たされない場合、スクリプトは終了します。
最後のスクリプトスレッドが終了します。
Guiが閉じられたり、破壊されたりします。
スクリプトのメインウィンドウが閉じられます(ただし、破壊すると従来通りパーシスタンスに関係なくスクリプトが終了します)。
OnEndコールバックがないInputHookは終了します。
柔軟性を持たせるため、OnMessageはスクリプトを自動的に永続化させません。
これに対し、v1スクリプトは、以下のうち少なくとも1つが成立する場合に「永続的」であるとします:
スクリプトで少なくとも1つのホットキーまたはホットストリングが定義されています。
GuiまたはOnMessage()がスクリプトのどこかに表示されます。
キーボードフックまたはマウスフックが装着されています。
入力が呼び出されました。
#Persistent を使用しました。
スレッドは、15ミリ秒ではなく17ミリ秒の中断不能タイムアウトで始まります。システムのティックカウントは最小15または16のステップで更新されるため、15は低すぎます。つまり、ティックカウントが正確に間違ったタイミングで更新されると、実質的に時間が経過していないにもかかわらず、スレッドが中断される可能性があります。
スレッドが中断されずにスタートした場合、中断されないタイムアウトが先に切れても、少なくとも1行が実行されるまで中断されないようになりました(例えば、スレッドがスタートした直後に、他のプロセスにCPU時間を与えるために、システムがプロセスを中断した場合)。
#MaxThreadsと#MaxThreadsPerHotkeyは、最初の行が以下の関数のいずれかであるサブルーチンの例外を作らないようになりました:ExitApp、Pause、Edit、Reload、KeyHistory、ListLines、ListVars、ListHotkeys。
デフォルトの設定
#NoEnv はデフォルトの動作なので、ディレクティブ自体が削除されました。同等の組み込み変数がない場合は、代わりにEnvGetを使用します。
SendModeのデフォルトは、Event ではなく Input です。
タイトルマッチングモードのデフォルトは、1ではなく2です。
SetBatchLinesが削除されたため、すべてのスクリプトがフルスピードで実行されます(v1のSetBatchLines -1に相当)。
作業ディレクトリは、デフォルトでA_ScriptDirとなります。A_InitialWorkingDirには、AutoHotkeyを起動したプロセスで設定された作業ディレクトリが格納されます。
#SingleInstance のプロンプトの動作は、すべてのスクリプトのデフォルトとなります。また、#SingleInstance Prompt
は、分かりやすくするためや、以前の指令を上書きするために、明示的に使用することができます。
CoordModeのデフォルトがWindowではなくClient(v1.1.05で追加)になっている。
スクリプトファイル(スクリプトが読み込むファイルは除く)のデフォルトのコードページがANSI(CP0)ではなく、UTF-8になりました。これは、従来通り、/CPコマンドラインスイッチで上書きすることができます。
#MaxMem が削除され、可変容量に人為的な制限がかからなくなりました。
デフォルトのスクリプト
スクリプトファイルを指定せずにAutoHotkey32.exeやAutoHotkey64.exeなどの実行ファイルを起動しても、ユーザーのドキュメントフォルダーで既定のスクリプトファイルを検索することがなくなりました。
ポータブルコピーを使用する場合を除いて、AutoHotkeyは実行ファイルを直接起動して使用することを意図していません。通常、実行ファイルを起動する代わりに、拡張子が.ahkのファイルを実行します。
特定の実行ファイルへのショートカットを作成するときは、ショートカットのターゲットにスペースとスクリプトのパス(通常は引用符で囲まれています)を追加できます。
コマンドライン
コマンドラインの引数は、番号付きグローバル変数の擬似配列に格納されなくなりました。代わりにグローバル変数A_Args(v1.1.27で追加)を使用する必要があります。
Rと/Fのスイッチは削除されました。代わりに/restartと/forceを使用してください。
関数ライブラリの自動インクルード機構が削除されたため、AutoHotkey.exeを使用してスクリプトの構文エラーをチェックする場合、/iLibの代わりに/validateを使用する必要があります。
以下のいずれかの場合、/ErrorStdOut は組み込みではなく、スクリプトのパラメータの1つとして扱われるようになりました: