情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

AutoHotkey v2 への移行・コード書き換え時のエラー対策

AutoHotkey (28) AutoHotkey v2 (4) Windows 11 (52)

AutoHotkey v1(v1.1)のスクリプトを、AUtoHotkey v2.0 用のスプリプトに書き換えた際のつまづきポイントなどをメモしておきます。

変更点は多くあるのですが、ドキュメント自体は豊富です。そのため、ドキュメントを参考にしながら試行錯誤していくことで、最初はゆっくりとでしたが、最終的にはぱっぱと書き換えを進めていくことができました。

※Windows 11 PCを使用。

公式ドキュメント

参考になる、v2移行関連の公式ドキュメントはこちら:

また、v2自体のドキュメントも役立ちます:

「Process, Priority,, High」の書き換え

; v1
Process, Priority,, High
; v2
ProcessSetPriority "High"

このように、引数を文字列として、""で囲うようになったケースが多くあります。

「#NoEnv」の書き換え

廃止されているので、不要となりました。指定時の挙動がデフォルト(強制)となったので。

#NoEnv: Obsolete because it will be the mandatory behavior in v2.
引用元

「Error: Function calls require a space or "(". Use comma only between parameters.」エラーの対策

コマンド用のシンタックスが廃止されたため、コマンド名の直後に「,」を置く「SetTitleMatchMode, 2」のような記法が廃止され、このような記載をしている場合、このエラーとなります。

典型的な回避方法は、その「,」を削除して、「SetTitleMatchMode 2」のようにすることです。

「Send, ^v」のような記法も同様に「,」は抜く必要があり、また、キー部分も文字列として「""」でくくる必要があるため、「Send "^v"」のように書きます。

「Error: This line does not contain a recognized action.」エラーの対策

「#InstallKeybdHook」で発生しました。InstallKeybdHook関数を使用するようにと案内されており、利用できません。今回は「InstallKeybdHook」に書き換え(冒頭の「#」を削除)て解消。

「#KeyHistory 100」は、「KeyHistory 100」のように書き換えます。

「#IfWinActive」は廃止されたため、「HotIfWinActive」等を使用します。

例えば、Activeなウィンドウに関係ないホットキーを書く場合には、「#IfWinActive」ではなく、「HotIfWinActive」と書きます。

「Error: Syntax error. Did you mean to use ":="?」エラーの対策

代入文で「=」を使用しているとこのエラーが発生します。代入では、「=」ではなく、「:=」を使用する必要があるため、書き換えます。

「Error: Illegal character in expression.」エラーの対策

このエラーが「Text: #」において発生しました。エスケープして書いていた「`#」の代わりに、「"#"」を使用して回避します。また、手前の変数との結合「%modifiers%`#」となっていたため、結合演算子を使用して「modifiers . "#"」のように書き換えました。

「Send ^#{Left}」でも発生しました。これは、「Send」の記法が変わり、従来の「Send {Left}」と直接キーを書く書き方から、「Send "{Left}"」と、ダブルクオートで囲むように変更されたためです。

「Error: Missing ending "#"」エラーの対策

「Loop % StrLen(~)」の構文で発生しました。式を埋め込むための「%」が廃止されたためです。。

There is no percent-space prefix to force an expression. Unquoted percent signs in expressions are used only for double-derefs/dynamic references, and having an odd number of them is a syntax error.
引用元

「%」を消して、解消しました。

「Error: Hotkey or hotstring is missing its opening brace.」エラーの対策

実行内容が複数行にわたるホットキーを設定するとき、「::」のあとに従来であればそのまま複数行を記述しReturnで終わる、という書き方が可能でしたがそれが廃止され、複数行にわたる場合は「{}」で囲まなければならなくなったた発生したエラーです。

; v1
^s::
    ...
    ...
    return

; v2
^s::
{
    ...
    ...
}

「Error: Missing operand.」エラーの対策

Ifを使用した部分で発生。原因は、廃止された「等しくない」を表す比較演算子「<>」を使用していたためで、「!=」に置き換えて解消しました。

変数を空にするために使用できていた「varName :=」という書き方も廃止されたので、「varName := ""」に変更しました。

var := with no r-value is treated as an error at load-time. In v1 it was equivalent to var := "", but silently failed if combined with another expression - for example: x :=, y :=.
引用元

「Error: Syntax error.」エラーの対策

このエラー自体はかなり広い意味を持っているエラーメッセージなので、様々な状況下で発生すると思われます。

しかしこれまで記載したエラーのように、他のエラーは他のエラーで他のエラーメッセージが表示されることも多いようです。

実際にこのエラーが発生したのは、「Send ^c」と書いていたか所でした。「Send(^c)」のように問題発生行が表示され、「Specifically: ^c)」のようにエラーが表示されていました。

この原因は、「Send ^c」とは書けなくなり、「Send "^c"」と文字列として関数に渡さなければならなくなったためで、この修正を行うことで解消しました。

「Warning: This variable appears to never be assigned a value.」エラー対策

「SendMode InputThenPlay」で発生しました。「SendMode "InputThenPlay"」と書き換えて解消しました

「StringSplit ...」でも発生しました。「StringSplit」が廃止されたため、後継の「StrSplit」を使用しました。

「ErrorLevel」でも発生しました。これは、ErrorLevelの前段で使用していた「ClipWait」の仕様が変更された影響で、ドキュメントを参考に対応しました。

「Suspend Permit」でも発生しました。こちらもSuspendの使い方が変更となった影響で、「#SuspendExempt」を使用しました。使用方法は若干異なるので、リンク先を参考にしてみてください。

「Error: Parameter #1 of GetKeyState is invalid.」エラーの対策

「GetKeyState("Win", "P")」で発生し、「Specifically: Win」と表示されました。

こちらは、GetKeyStateで指定できるキーに「Win」はなく、「LWin」または「RWin」しか指定できないためです。

コメント(0)

新しいコメントを投稿