autohotkey2.0勉強中(翻訳)その6~式編~
目次
はじめに
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
式編
- 式は、一連の変数、リテラル文字列、および/またはリテラル番号に対して1つまたは複数の操作を実行するために使用される
- 式内の変数は、パーセント記号で囲まなくていい(引用符付きの文字列内の変数、擬似配列およびその他の二重引用符を除く)
したがって、リテラル文字列は変数と区別するために二重引用符で囲む必要がある
ex: if (CurrentSetting > 100 or FoundColor <> "Blue")
式に空の文字列を指定するには、空の引用符を使用する
ex: if (CurrentSetting > 100 or FoundColor <> "")
式の結果を変数に代入するには、:= 演算子を使用する
ex: NetPrice := Price * (1 - Discount/100)
ブーリアン(boolean)型
- 式が真または偽(IF文など)で評価する必要がある場合、空白またはゼロならは偽とみなされ、他のすべての結果は真とみなされる
- 変数を空白にするか0を代入するだけで、偽の値を保持することができる
ex: 変数*ItemCount*が空白または0の場合 if ItemCount はfalse(偽)の判定(結果)になる ex: if Done とすると(Doneは変数)変数の値がtrueかfalseか判定できる
ex: A_Indexが5より大きい場合は変数Doneに1が、それ以外の場合にはFoundItの値が割り当てられる Done := A_Index> 5 or FoundIt
- 式中では、trueとfalseは1と0に解決される
ex: スクリプトをより読みやすくするためにこう書いてもいいっていうか書くなら普通こう書くでしょっていう CaseSensitive := false ContinueSearch := true
イント(整数)及びフロート(浮動小数点数)(Integers,floating point)型
- 式中で、小数点や科学的表記法を含む数値は浮動小数点数と見なされる
- それ以外の場合は整数として見なされる
- 加算や乗算などのほとんどの演算子では、いずれかの入力が浮動小数点数の場合、結果も浮動小数点数になる
- 式と非式の両方で、整数は16進数または10進数のいずれかの形式で記述できる
- 16進数はすべて0xで始まる、例えば、Sleep 0xFFはSleep 255と同じ
- 浮動小数点数は、オプションで小数点の有無にかかわらず科学的表記法(ex: 1e4または-2.1E-4)で記述することができる
- 式中では、128、0x7F、1.0などの引用符で囲まれていない数値は、スクリプトが実行を開始する前に純粋な数値(十進数)に変換されるため、数値を文字列に変換すると、元のとは異なる値が生成されることがある
- 3/2では1.5が得られ、4/2では2ではなく2.0が得られる
- 1.0、5.0 // -3 は -2.0になる
式の代入/条件分岐
- 変数の代入・計算・条件分岐とは別に、複雑な式を用いた代入や条件分岐も使用できる
- また、一部のコマンドにある単独で数値を指定するパラメータでは、式で値を指定することもできる
- それ以外のパラメータでは、「% a+b」のようにパラメータの最初に「%」と半角スペースをつければ、式を指定できる
- 式の代入/条件分岐では、他のコマンドとは変数の扱い方などが違っている
ex: Var1 := 100 Var2 := Var1+10
- 式の代入には、「:=」を使う
- 式中で変数を使うときは、「%」ではさまずに、そのまま記述する
- 数字列は数値として計算される
- ahk1で使えた「=」は使えない、「:=」に統一されたそのくせ例はそのままで「=」のままなんだよな混乱する(´・ω・`)
ex: Var1 := 100 Var2 := 10 Index := 1 VarName := Var2 Var3 := Var%Index%+%VarName% a := 1 b := 2 c := 3 xxx1xxx23xxx := 10000 Var := xxx%a%xxx%b%%c%xxx
- 式中に「%」ではさんで変数名を書くと、その内容が展開された上で、変数名として扱われる
- 前後の変数名として妥当な文字とあわせて変数名として扱われる
- 変数参照を展開した結果が式などになる場合、不正な変数名としてエラーになる
ex: If(Name:="Taro" or Name:="太郎") MsgBox,He is Taro.
- 式による条件分岐は上記のように、Ifに続いて式を括弧で囲んで書く 文字列は、「"」で挟む
- 空の文字列を表すには、「""」と2つ続けて書けばよい
- 式中に「"」を含む文字列を使用したい場合、「"」の代わりに「""」と2つ続けて書く
ex: SetFormat,FLOAT,0.1 Var := 0.0 * 0.0 MsgBox,%Var% Var := 10/3 MsgBox,%Var% Var := 10/3 * 10/3 * 10/3 MsgBox,%Var%
- 算術演算子のどちらかが小数値だった場合、結果は小数値になる また、演算結果が小数になる場合も、自動的に小数値になる
- 算術演算の結果が小数の場合、計算途中は浮動小数点値で保持され、最終的にSetFormatコマンドで指定された形式で変数に格納される
- 「1/0」「x+*y」などのように、正常に処理できない演算は、空の文字列として扱われる
その他の条件分岐
- If / IfEqual / IfNotequal / IfLess / IfLessOrEqual / IfGreater / IfGreaterOrEqual 変数の比較(「:=」「<>」「>」「<」「>=」「<=」と同じ)
- IfExist / IfNotexist ファイルの存在の有無
- IfInString / IfNotInString 文字列中に指定の文字列が含まれるかどうか
- If var [not] in values / If var [not] contains values varの内容がvaluesに列挙した文字列と一致するかどうか
- If var is [not] type 変数のデータ形式
- IfMsgBox 一番最近のMsgBoxコマンドで押されたボタン
- IfWinActive / IfWinNotActive 指定したウィンドウがアクティブかどうか
- IfWinExist / IfWinNotexist 指定したウィンドウが存在するかどうか
各種演算子
文字列演算子
- Exp1 . Exp2 2つの変数や文字列、式の結果を文字列として連結する
- Exp1と「.」、「.」とExp2の間にはスペースを空けなければいけない
算術演算子
- A: 「-」をつけられた項や式は負の値を表す
- A+B: 加算
- A-B: 除算
- A*B: 乗算
- A/B: 除算
- A//B: 割り切らない除算
- たとえば、「7//3」 は 2に、「7//-3」 は -2になる
- いずれかの被演算子が小数表現だった場合、小数として除算した商を超えない最大の整数に丸められる
- また、この場合結果は小数表現になる(「7//3.0」 は 2.0、「7//-3.0」 は -3.0になる)
- A**B: 累乗、AのB乗
- AとBは共に小数値が使用できる
ビット演算子
- ビット演算を使用できるのは整数値のみ
- 小数値は、整数値に変換してから計算される
- つまり誤差が出る
- 内部的には64ビット符号付整数で扱われている模様
- 符号付64ビット整数の範囲(-9223372036854775808..9223372036854775807)の範囲に収まらない場合、65ビット目より上は切り捨てられる
- ~A: Aのビットを反転する
- 32ビット符号なし整数の範囲内の値は、下位32ビットだけ反転される
- (負の値の場合、32ビットでも64ビットでも結果は同じ)
- A|B: ビットの論理和
- A&B: ビットの論理積
- AB: ビットの排他的論理和
- A>>B: Aを右にBビットだけシフトする
- 論理右シフトなので、最上位ビットが1でも、開いた左側には常に0が詰められる
- 算術右シフトをしたいときは、2**Bで割る
- A<<B Aを左にBビットだけシフトする
論理演算子
- 数値のゼロや空の文字列は偽(False)として扱われ、それ以外は真(True)として扱われる
- 論理演算の結果を変数に代入すると、偽(False)の場合「0」、真(True)の場合「1」が代入される
- ! A(NOT A) 真偽を反転する
- !のほうが演算子の優先度が高い
- A || B(A OR B) 論理和
- A && B(A AND B) 論理積
比較演算子
- 主に条件分岐で使用するが、比較演算の結果を変数に代入する場合、偽(False)なら「0」、真(True)なら「1」が代入される
- 数値でないものを比較する場合、文字列として文字コードの並び順で比較される
- 数値であっても、「"」で囲まれている場合は、文字列とみなされる(ex: 「"10"」)
- このとき、StringCaseSenseコマンドで設定が変更されない限り、大文字小文字の違いは無視される(「=」「==」を除く)
文字列の演算における大文字小文字の違いは常に無視される
A > B: AがBより大きいなら真(True)になる
- A < B: AがBより小さいなら真(True)になる
- A >= B: AがB以上なら真(True)になる
- A <= B: AがB以下なら真(True)になる
- A = B: AとBが同値のとき真(True)になる
- A == B: AとBが同値のとき真(True)になる
- A != B(A <> B): AとBが同値でないとき真(True)になる
アドレス演算子
- &Var 変数Varの格納されたメモリ領域のアドレスになる
- *Addr アドレスが整数Addrで表されるメモリ領域のバイト値(0...255)になる
- 「*Addr := Asc("x")」のように代入先にはできない
- 値を変更するには、「DllCall("RtlFillMemory", UInt, Addr, UInt, 1 , UChar, Asc("x"))」のようにする
autohotkey2.0勉強中(翻訳)その5~変数編~
最終更新日: 2017/10/30
目次
はじめに
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
変数編
変数の型
- 変数やコマンドの引数として使われる値は、すべて文字列として保持される
- 明示的に変数の型を定義する必要はなくて、任意の変数に文字列、整数、浮動小数点数、またはオブジェクトへの参照を代入することができる
- また、数値は必要に応じて文字列に自動的に変換される
- 変数の型を判別したい場合はType関数を使用することで判別することができる
- 値が特定のフォーマットの場合、整数、小数、日付時刻として計算などで使うことができる
- どのような書式が 各コマンドが対応(原文:出力)する整数・小数の文字列表現フォーマットなのかは、SetFormatコマンドで設定できる
変数のスコープと宣言
- 関数のローカル変数を除いて、すべての変数はグローバル変数として扱われる
- 関数内で定義された変数を除いて、変数をグローバル宣言する必要はない
- 変数を使用することによってその変数が存在するようになる(定義されたことになる、使用できるようになる)
- スクリプト起動時に、各変数の値はemptyまたはblankでスタートする
変数の名前
- 変数名は大文字と小文字は区別されない(たとえばCurrentDateはcurrentdateと同じ)
- 変数名は最大253文字で、文字、数字、アンダースコア、ASCII以外の文字で構成され、変数名は数字で始めることはできない
予約語
以下の単語は演算子として、もしくは制御フロー文の名前として予約または使用されているため、変数名として使用できない
まあつまり既にこれらの名前はahkに使われてるから使えないってこと
また、関数、クラス、およびウィンドウグループでも変数と同じ検証を使用するため以下の単語が使えない
予約語の一覧(abc順)
and | break | catch | continue | else |
Finally | For | Gosub | Goto | If |
in | is | Loop | LoopFile | LoopParse |
LoopRead | LoopReg | new | not | or |
Return | Throw | Try | Until | While |
変数への値の代入(格納)
- 変数に値を代入するには「:=」の後に数字、引用符付き文字列、または他のタイプの式を書く
- ahk2からは「=」は使えず、「:=」に統一された←ここ重要
ex: 代入の例 Var := 123 ;数値*123*の代入 Var := "Var" ;文字列*Var*の代入
- 値が割り当てられていない変数には、デフォルトで空(blank/null)の文字列が含まれている
変数に割り当てられたメモリの解放
ex: Var := "" という風に空の値を割り当てることで、割り当てられたメモリを開放できる
- 変数には、コマンドの出力変数として間接的に値を割り当てることもできる
関数の出力変数を用いて間接的に変数への代入を行う
ex: アクティブウィンドウのタイトルを関数の出力変数*Title*に代入 WinGetTitle *Title*, A
- 変数が整数の場合、64ビット整数(long)相当の値が扱える
- 変数が少数の場合、double値相当の値が扱える
- 変数とは別に、環境変数(後述)も扱うことが出来る(どこからこれ持ってきたんだろう?)
- EnvSetコマンドで環境変数に代入する
- この環境変数は、Runコマンドなどで起動したプログラム内から参照できる
- 変数の展開では、通常の変数も環境変数も展開できるが、未定義の変数は長さ0の文字列に展開される
- 1変数の容量の上限は64KBである(#MaxMem指令で変更可能)
- 組み込み変数は「組み込み変数」を参照
変数の値(内容)を取得する
- 変数の内容を文字列に含めるには、変数名をパーセント記号「%」で囲めばいい
ex: MsgBox、変数Varの値は%Var%です MsgBox( "変数Varの値は%Var%です" )
- また、パーセント記号「%」は式の変数参照(引用符付き文字列以外、式内など)では省略していい
ex: MsgBox( "XとYの合計は(X + Y)です" )
エスケープシーケンス(エスケープ処理)
- ファイルパスの「\」のエスケープの必要をなくすため、エスケープ文字は「`」(Shift+@)になっている
- 以下に示すエスケープシーケンスが使える
- それ以外の文字をエスケープした場合、その文字自身になる(例:「`x」→「x」)
EscapeChar指令でエスケープ文字を変更できるらしい
- 任意のコマンドの最初のカンマを省略することができる
- (最初の引数が空白の場合や::=などの代入演算子で開始する場合、またはコマンドが継続セクションの一番上にある場合を除く)
- 例外1:MsgBox内のカンマはエスケープする必要はない
- 例外2:コマンドの最後の引数のカンマはエスケープする必要はない
エスケープシーケンス一覧
- コマンドの区切りと区別するため、エスケープが必要
- なお、コマンドの最後の引数内では、文字としてのカンマであることが自明なため、カンマをエスケープする必要は無い
- `; 「;」で、半角スペースかTab文字の次に来る場合のみ、コメントの開始記号と区別するためにエスケープする必要がある
- `:: 文字列「::」(コロン二つ)ホットストリングなどで使用
- `% 「%」(パーセント記号)
- `n 改行(LF/0x0A)
- `r 復帰(CR/0x0D)
- `t Tab文字(0x09)
- `v 垂直Tab(0x0B)
- `b BackSpace文字(0x08)
- `a Bell文字(0x07)
- `f 改ページ(0x0C)
- `` 「`」自身なんかバックスラッシュ二個と同じ意味合いをもつらしい
- `, 「,」(カンマ)の文字 プログラム最後のカンマとMsgBoxではエスケープしなくていい
- `"または`' 一重引用符と二重引用符は同じ意味を持つが、一重引用符で囲まれた文字列の中では二重引用符を使用するとそのまま二重引用符が扱える、説明しにくいので以下の例を見て
ex:一重引用符の中に二重引用符を用いる例で、以下の二つは同じ結果 Var := "The color \`"red\`" was found." ;「"」をエスケープ「\`"」して書いた場合 Var := 'The color "red" was found.' ;「'」で囲んでいるので中にある「"」はエスケープしなくてもよい
Sendモードにおけるエスケープシーケンス
Sendコマンドまたはホットストリングをデフォルト(非raw)モードで使用すると、{} ^!+#などの文字は特別な意味を持つため、
これらを文字通り使用するには、中括弧で囲む
ex: Send {^} {!} {{}
setpointさんがまじでsetpointさんなので強制的にアプリ設定がリセットされないようにした(autohotkey2)
はじめに
setpointさんがパソコン(win10)が起動するたんびにアプリケーションの設定がリセットされるのでautohotkeyさんを使って強制的にリセットされないようにした
setpoint(無能)さんまじでsetpoint(無能)さん
いくつかのサイトではデバイスのappoverrideだったかなんかを消せば解決するってなっていたけども自分のバージョンではできなかった
ダウングレードすればできたけどなんか気に入らなかったからというかいろいろあったから最新版にした(最新版でも解決してるならなんのせいだろうね)
autohotkeyさんについては検索でもしてほかの方の説明を見ればいいんじゃないかな
かなり細かく書いているので、操作がわかる人は基本的に太字の文のみ読めば大丈夫
まあ自己責任で
ということで環境とやり方↓
環境
- win10 1703(アップデートしてなければ)
- setpoint コントロールセンター : 6.67.83
- setpoint ドライババージョン : 5.90.41 (関係ないと思うけどまあなんとなく)
- Autohotkey2.0a3なんちゃらだった気が
やり方
事前にuser.xml(setpointの設定)とsetpointの起動ショートカットのコピーを別の場所に作成しておき、PCの起動時に上書きをする
その後、setpointさんの起動をする
このため、元から設定されているスタートアップは消すもしくは無効化しておく
スタートアップとかuser.xmlのコピーとかの説明はいらないんだよってひとはこれをクリック
まずはsetpointのスタートアップを無効にする
setpointの設定のコピーを作成する
- setpointのAppdataフォルダを開く
C:\Users\ユーザー名\AppData\Roaming\Logitech\SetPoint\ をエクスプローラーなどで開く 表示されていない場合
中にある user.xml をコピーする
- autohotkeyのスクリプトなどを格納するためのフォルダとバックアップのためのフォルダを作成する
- 作成した両方のフォルダにペーストする
setpointのショートカットのコピーを作成する
- setpointのプログラムフォルダを開く
- 64bit版ならC:\Program Files\Logicool\SetPointP\ 、32bit版ならC:\Program Files\Logicool\SetPointP\ をエクスプローラーなどで開く 自分のOSが何bitかわからない場合はスタートボタンを右クリックして出てきたメニューのシステムをクリック、出てきた画面の中にある64ビットもしくは32ビットと書いてあるのを探し、それが自分のOSのビットになる
- マウスおよびキーボードの設定.lnkをコピーする
- 先ほど作った二つのファルダにペーストする
- setpoint.lnk に名前を変更する
autohotkeyのスクリプトを書く
- なんでもいいのでテキストエディタ(メモ帳)で以下のコードをコピー&ペーストする - 何の変更もしなくて大丈夫
FileCopy, user.xml, %A_Appdata%\Logitech\SetPoint\user.xml, 1
Run, setpoint.lnk
Return保存したスクリプトをスタートアップに登録する
設定してない人向け) 「.ahk」ファイルにアイコン(緑色のアイコン)がついてない人は「.ahk」ファイルの関連付けを行う
- 先ほど保存したスクリプト(.ahk)を右クリックし、「プログラムから開く」の「別のプログラムを開く」を選択
- 「その他のアプリ」の「このPCで別のアプリを探す」をクリック
- autohotkeyの実行ファイル(Autohotkey.exe)があるところに移動し、選択し、OKを押す
あとがき
疲れた
とりあえず写真欲しいね
ていうかautohotkeyで各ソフトにも割り当てればいいと思ったけどいいや
まあいつも通り困ってる人がいてその役に立てばいいかなっていう記事
動作保証等はしかねるので自己責任ですー。
autohotkey2.0勉強中(翻訳)その4-2~スクリプト編その2~
最終更新日:2017/10/30日(整形のみ)
前回のその1はこちら
目次
はじめに
その2では、これらの事について扱っている
これらは知らなくても普通に使えるため、結構適当
一部コンテンツ記載してないけど
+ AHKのコマンドライン引数
+ スクリプトの文字コード
+ スクリプトのEXE化(コンパイル)
その1はこちら
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
スクリプト編(その2)
プログラムのコマンドライン引数
AutoHotkeyのコマンドラインの書式は以下の通り
AutoHotkey.exe [Switches] [Script Filename] [Script Parameters]
コンパイル済みのexe(実行ファイル)については以下の通りになる
CompiledScript.exe [Switches] [Script Parameters]
以下ではそれぞれの場所に使用できるものについて書いてある
[Switches] に使用できるオプション
オプションのため、使用しなくても構わない コンパイル後でも使用できるもの、できないものがある
コンパイル後でも使えるもの
- /f(または/force):警告ダイアログを出さずに、強制的に起動
- #SingleInstance Offと同じ効果
- /r(または/restart):スクリプトを再読み込みしたいときに使用
- /ErrorStdOut:文法エラーをダイアログ表示せずに標準出力に出力する
コンパイル後では使えないもの
- /Debug:デバッグクライアントに接続する
- 詳細については、「対話型デバッグ」を参照(後ほど)
- /CP「n」:スクリプトファイルの読み取りに使用されるデフォルトの文字コードを上書きする
/iLib "Outfile" AutoHotkeyはスクリプトをロードしますが、実行せず、ライブラリ機構を介して自動的にインクルードされるスクリプトファイルごとに、OutFileで指定されたファイルに2行づつ書き込まれる
- 書き込まれる行は、次の形式で記述される
LibDirはLibフォルダのフルパスで、LibFileはライブラリのファイル名 \#Include LibDir\ \#IncludeAgain LibDir\LibFile.ahk
出力ファイルが既に存在する場合は上書きされる
- OutFileは、「"」の代わりに「*」で囲むと標準出力(stdout{standardout})にできる
- 詳細は「標準出力」を参照(後ほど)
- スクリプトに構文エラーが含まれていると、出力ファイルが空になることがある
- プロセス終了コードを使用してこの状態を検出できる
- 構文エラーがある場合、終了コードは2になる
- /ErrorStdOutスイッチ(↑のやつ)を使用すると、エラーメッセージを抑制またはキャプチャできる
[Script Filename] に使用できるオプション
- [Script Filename] は引数がない場合は省略可能
- [Script Filename] を省略した場合(スタートメニューから直接AutoHotkeyを実行する場合など)は、「~.ahk」の名前のファイル(詳細は後述)を以下の順で検索する
1.AutoHotkey実行可能ファイルを含むディレクトリ 2.現在のユーザーのドキュメントフォルダの順番で検索される
- ファイルが存在しない場合、デフォルトのファイルを作成するかをたずねるダイアログが出る
- スクリプトに引数を渡したい場合は省略できない
- また、検索するファイル名(上記の「~.ahk」)は、スクリプトを実行するために使用される実行ファイルの名前によって異なる
- AutoHotkey.exeの名前をMyScript.exeに変更すると、MyScript.ahkが検索される
引数なしで*AutoHotkeyU64*.exeを実行すると、*AutoHotkeyU64*.ahkが検索される
[Script Parameters] に使用できるオプション
- [Script Parameters] には任意の数の文字列をスペース区切りで渡せる
- 文字列スペースを含みたい場合は「"」で囲む
- 渡された引数は、組み込み変数「A_Args」に配列に格納され、配列構文を使用して参照できる
- 「A_Args [0]」には引数の数が格納されるらしい
- スクリプトに渡される引数の数がわからない場合(一連のファイルをスクリプトにドラッグアンドドロップした時など)、次の例を使用してそれらを1つずつ抽出できる
ex:
for n, param in A_Args ; For each parameter: { MsgBox "Parameter number " n " is " param "." }
- 引数がファイル名である場合、次の例を使用して、ファイルシステムに格納されている大文字と小文字を区別した長い名前に変換できる(完全/完全パスを含む)
ex:
for n, GivenPath in A_Args ; For each parameter (or file dropped onto a script): { Loop Files, GivenPath, "FD" ; Include files and directories. LongPath := A_LoopFileFullPath MsgBox "The case-corrected long path name of file`n" GivenPath "`nis:`n" LongPath }
- なお、スクリプト自身のパスを取得するには「A_ScriptFullPath」変数を使用する
- 既知の制限:ファイルを.ahkスクリプトにドラッグすると、NTFSファイルシステムで8.3の名前が無効になっていると正常に動作しなくなる可能性があるらしい
スクリプトファイルの文字コード
スクリプトファイルに含まれる文字は、ファイルのロードに使用される文字コードによって制限される
まあ大体UTF-8で書くだろうからあんま気にしなくていいんじゃないかな
ボム付きにすれば基本的に問題ないんじゃない?
ファイルがUTF-8またはUTF-16(LE)バイト順序マークで始まる場合、適切な文字コードが使用され、/CP「n」スイッチ(コマンドライン引数のswitchオプションの/CPnのこと前述済み)は無視される
/CP「n」スイッチがコマンドラインで渡されると、文字コード「n」が使用される
有効な文字コード識別子の数値一覧については、「MSDN」を参照(後ほど)
それ以外の場合は、システムのデフォルトの「ANSI」が使用される
これは、AutoHotkeyで読み込まれたスクリプトファイルにのみ適用され、スクリプト自体の中でI/Oファイルには適用されないことに注意
FileEncodingは、スクリプトによって読み書きされるファイルのデフォルトのエンコーディングを制御する
IniReadおよびIniWriteは常にUTF-16またはANSIを処理する
すべてのテキストが(必要な場合)ネイティブの文字列形式に変換されるため、無効またはネイティブコードページに存在しない文字は、プレースホルダ' 'に置き換えられる
これは、スクリプトファイルにエンコーディングエラーがある場合、またはファイルの保存とロードに使用されたコードページが一致しない場合にのみ発生する
RegWriteを使用して、エクスプローラから起動されたスクリプトのデフォルトを設定することができる(ファイルをダブルクリックするなど)
ex:HELPそのまま、autohotkeyがインストールされている前提
; 下の行のコメントを外すか、コメントにすべてコメントしておく ; 現在のビルドのデフォルトにリセットするなど、必要に応じて変更する ; ↑のコメント二つ適当に訳した ; codepage := 0 ; システムデフォルトのANSI ; codepage := 65001 ; UTF-8 ; codepage := 1200 ; UTF-16 ; codepage := 1252 ; ANSI ラテン語 1; 西ヨーロッパ(Windows) if (codepage != "") codepage := " /CP" . codepage cmd := Format('"{1}"{2} "%1" %*', A_AhkPath, codepage) key := "AutoHotkeyScript\Shell\Open\Command" if A_IsAdmin ; Set for all users. RegWrite cmd, "REG_SZ", "HKCR\" key else ; Set for current user only. RegWrite cmd, "REG_SZ", "HKCU\Software\Classes\" key
スクリプトのEXE(実行ファイル)化
方法
- ahk2exe.exeを使うことで、スクリプトを実行ファイル化することが可能
- 最新のahk2にはコンパイラが同封しているみたい使用方法はたぶんそのままで大丈夫だと思う
Ahk2Exeは、以下の三つの方法で使用できる
1.GUIインターフェイス:スタートメニューの「.ahkから.exeへの変換」を実行
2.右クリック:開いているエクスプローラウィンドウ内で任意の.ahkファイルを右クリックし、[スクリプトのコンパイル]を選択(AutoHotkeyのインストール時にスクリプトコンパイラオプションが選択されている場合のみ使用可能)これにより、スクリプトと同じ基本ファイル名のEXEファイルが作成される
このファイルは、同じディレクトリに短時間で表示される
注:EXEファイルは、同じカスタムアイコン、.binファイルを使用して作成され、上記の方法1で最後に使用されたMPRESS設定を使用される
Ahk2Exe.exe / in MyScript.ahk [/ out MyScript.exe] [/ icon MyIcon.ico] [/ bin AutoHotkeySC.bin] [/ mpress 0or1]
スペースを含む引数は二重引用符で囲む必要がある
"out"項目を省略すると、EXEはスクリプト自体と同じベースファイル名を持つようになる
ex)Ahk2Exe.exe /in "MyScript.ahk" /icon "MyIcon.ico"
- 引数がAhk2Exeに渡されると、コンパイルプロセスの成功または失敗を示すメッセージがstdoutに書き込まれる。メッセージはコマンドプロンプトに表示されないが、出力をファイルにリダイレクトするなどの手段で「キャッチ」できる
- さらに、エラーの場合、Ahk2Exeには、発生したエラーの種類を示す終了コードがあり、これらのエラーコードはGitHub(ErrorCodes.md)にあるってさ
- リソースハッカー(フリーウェア)などのユーティリティを使用して"AutoHotkeySC.bin"ファイルを編集することで、コンパイル済みのスクリプトにバージョン情報(エクスプローラのファイルプロパティダイアログに表示されるやつ)を編集(追加)できる
- このファイルはAutoHotkeyがインストールされた "コンパイラ"サブフォルダに含まれている
- また、Compile_AHK IIを使うとこのプロセスを容易にできる
コンパイルされたスクリプトを圧縮するには
- Ahk2Exeはオプションで、コンパイルされたスクリプトを圧縮するためにMPRESS(MATCODEソフトウェアのフリーウェア)を使用する
- mpress.exeがAutoHotkeyがインストールされた "コンパイラ"サブフォルダに存在する場合、/ mpress 0またはGUI設定によって無効にされない限り、自動的に使用される
- オフィシャルウェブサイト(2016年3月オフライン):http://www.matcode.com/mpress.htm
- ミラーサイト(ダウンロードと情報):https://autohotkey.com/mpress/
Tips
- コンパイルされたスクリプトでは通常、タスクトレイメニューからメインウィンドウを表示することは出来ない
- #NoTrayIconコマンドと "Menu、Tray、ShowMainWindow"コマンドは、コンパイルされたスクリプトの動作に影響する
- 「Menu,TRAY,MainWindow」でメインウィンドウを表示可能にできる
- スクリプト側が、コンパイルされた状態で実行されているかどうかを知るには、「A_IsCompiled」変数を使用する、「1」ならコンパイルされている(それ以外は「0」)
- 逆コンパイラも公開されているが、パスワードで暗号化すれば逆コンパイルを防げる
- 作成した実行ファイルの配布は自由
- 実行可能ファイルを圧縮すると、メモ帳やPEリソースエディタなどのプレーンテキストエディタを使用してスクリプトのソースコードを簡単に検査することはできませんが、その目的専用のツールでソースコードを抽出することができなくなる
autohotkey2.0勉強中(翻訳)その4-1~スクリプト編その1~
最終更新日: 2017/12/23
目次
はじめに
その1ではスクリプトの基礎編として知っておくべき事柄を抜擢して並べてみた
(エスケープシーケンス入ってないけど)
内容としては以下の通りになっている
AHKの最新版(a081)では全ての関数が関数(function)に変更され、第一引数との間のカンマが不要になっているなど変更点あり
また、エスケープシーケンスも異なる仕様になったので注意
その2では、AHKのコマンドライン引数、スクリプトの文字コードについて、、スクリプトのEXE化(コンパイル)について扱っている
これらは知らなくても普通に使えるから後回し
その2はこちら
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
スクリプト編その1
スクリプトの書き方(基礎)
スクリプトは基本的に1行1命令(関数)で書く
スクリプトを起動したら、スクリプトは一行ずつ読み込まれ、最適化、検証されるため、エラーがあったら通知してくれる
また、エラーがあった場合は、そのエラーが修正されるまでプログラムを実行できない
関数の引数に文字列を指定する場合は、「"」で括はないといけない
ex: 一行分のスクリプト どちらもOK
以下のスクリプトの詳しい説明
MsgBox [なんちゃら]で[なんちゃら]を画面に表示する(メッセージを表示する関数)
下記の例はスクリプトの一行分になり、その内容は、MsgBox関数を用いて、引数This is script.をMsgBox関数に渡している
引数が文字列だが、スクリプト内になるため、「"」を使用しなくていいため使用してない
MsgBox "This is script."
スクリプトの起動とAuto-execute(自動実行)セクション(以下自動実行セクション)
スクリプトを起動した際の動作について書かれていて、スクリプトを記述する際、どういう風に動作するのかが書かれてる
スクリプトが読み込まれる(ahk.exeで実行される)と、Return、Exit、ホットキー、ホットストリング、スクリプトの終わりのいずれかに達するまで先頭から自動的に実行される
この部分(スクリプトが自動実行される範囲)のことを、自動実行セクションと呼ぶ
自動実行セクションが終了した際に、ホットキーなど(以下参照)がスクリプト中に記述されている場合はスクリプトが常駐状態にされる
(まあスクリプトが勝手に終わってホットキーとかが動作しないとかなったら大変だしね)
常駐状態にならない場合、スクリプトは終了する
常駐状態の場合は、ホットキー、ホットストリング、GUIイベント、カスタムメニュー項目、タイマーなどのイベントに応答して、待機(アイドル)状態で動作し続ける
自動実行セクションの完了後にこれらの条件が変更された場合や、(たとえば、最後のタイマーが無効になった場合)、最後に実行されたスレッドが完了するか、最後のGUIが終了すると、スクリプト(自動実行セクション)が終了する
自動実行セクションが終了しない例
- ホットキー
- ホットストリング
- 可視GUI(アクティブなGUI)
- アクティブなメッセージモニタ
- タイマー
- OnClipboardChangeコールバック関数
- カスタムトレイメニュー項目
- および#Persistent指令(ディレクトリ)
- Lock系キーの固定
ホットキー、カスタムメニューアイテム、タイマーで起動されるスレッドでは、下記に記載する関数での設定はそれぞれ独立している
これらの初期値は自動実行セクション内で設定できる
設定が行われる前にスレッドが呼び出されると、期待した動作にならないことがあるので、自動実行セクションのできるだけ最初の方で設定しよう
デフォルトでは自動実行セクションが完了すると、下記の設定は再度初期値に更新される
だからホットキー、ホットストリング、タイマー、またはカスタムメニュー項目を含むスクリプトの一番上でデフォルト値を変更するのがいい
自動実行セクションが完了するまでに長い時間がかかる場合(または完了しない場合)、設定のデフォルト値は100ミリ秒後に有効になる
実行時に設定が初期化される該当関数設定一覧
- DetectHiddenWindows
- DetectHiddenText
- SetTitleMatchMode
- SetBatchLines
- SetKeyDelay
- SetMouseDelay
- SetWinDelay
- SetControlDelay
- SetDefaultMouseSpeed
- Thread attributes
- CoordMode
- SetStoreCapslockMode
- AutoTrim
- SetFormat
- StringCaseSense
コメントの書き方
コメントの書き方は以下の3通りある
スクリプトを書いたときにどんなことをするために書いたのか、戻る値がなんなのかなどを書いておくことに使う
- 行頭がセミコロン「;」の行はコメント行
- 関数のあとに半角スペースを空けてセミコロンがあれば、それ以降は行末までコメント(行コメント)
- /* …… */で囲まれた範囲もコメントになる(複数行コメント)
ex:
;コメント Run "autohotkey.exe" ;これ以降はコメント(1行に限る) /* 複数行 に わたる コメント */
エスケープシーケンス
AutoHotkeyのエスケープ文字は、キーボードの左上にあるアクセント/バッククォート( )です
引用符は引用符で囲まれた文字列の中に含めるためにエスケープすることが出来る
たとえば、 ""
"", "" およびChr(34)という式はすべて二重引用符を含む文字列を生成する
特定の特殊文字も、エスケープシーケンスを用いて使用することが出来る
t(タブ),n(改行)、
r(改行)など
長い一行のスクリプトを分割する方法
スクリプトの一行がとてつもなく長いと読みづらいよね
そこで、長いなら分割すればいいじゃないか、ということになったのか何なのか知らないが、複数行に分割することができる
なお、分割しても実行の速度は変わらない←ここ重要
ヘルプの書き方だと主に引数に使用するっぽい
方法その1
やり方
and、 or、||、&&、カンマまたはピリオドで始まる行はそのすぐ上の行と自動的に結合(併合)される
++/--を除く他のすべての式演算子についても同じように一つ上の行と結合される(演算子詳細はまた今度)
これらの行の接続詞のあとにインデントは入れる必要はないが、入れたほうが可読性は上がると思う
また、上の行とつながっていることを示すコメントを入れておくことで、可読性が増す
いずれかの行と行の間または文末に、空白行またはコメントを追加することができる
方法その1の例(長いので折り畳み)
全ての例で[*]で囲んでる部分がスクリプトの結合をしている部分
ex1: 2行目がコンマで始まるため、最初の行に2行目が追加(結合)される
FileAppend "This is the text to append.`n" ; ここにコメントを書くことが出来る、`nは改行のこと *,* %A_ProgramFiles%\SomeApplication\LogFile.txt ; Comment.
ex2:"and"または "or"で始まる例
if (Color = "Red" or Color = "Green" or Color = "Blue" ;コメント *or* Color = "Black" or Color = "Gray" or Color = "White") ;コメント *and* ProductIsAvailableInColor(Product, Color) ; コメント
ex3: その他の例 この場合は三項演算子
ProductIsAvailable := (Color := "Red") *?* false ; この部分は単純に三項演算子として使われているっぽい *:* ProductIsAvailableInColor(Product, Color)
方法その2
「複数の行を結合する」または「結合したい行が"方法その1"に適していない」場合に使用する必要がある
この方法はホットストリングの自動置換に特に便利らしい
この方法を継続セクションというのだが、長いので、簡易的なやり方と、継続セクションについてがっつりで項目を分けた
やり方
結合したい複数の行を「()」で囲むだけでいい
また、初めの「(」は必ず改行してから始めなければならない
()で囲った部分は継続セクション(継続節)と言う
次の章で扱うオプションを用いないとデフォルトの状態だと各行の結合に改行が用いられるので注意
また、途中に)で始まる行を含めたい場合は、`)のようにエスケープする
方法その2の例
ex1: 継続セクションの例
「"」で囲んでいるのは変数「Var」に継続セクションを文字列で代入しているから
式に該当するので、「"」で囲まないといけない
Var := " ( ;ここから Line 1 of the text. Line 2 of the text. By default, a linefeed (`n) is present between lines. )" ;ここまでは継続セクション 結合した結果: Line 1 of the text. Line 2 of the ~ (改行で結合されるということが言いたい9)
ex2: 継続セクションのあとにオプションがくる場合の例かな?
下の例の一番下の行には、最初の行のFileAppendの最後の引数が含まれていて、このような書き方もできるらしい
このような場合にはカンマが引数を区切るためのカンマと認識される
FileAppend " ( ;ここから A line of text. By default, the hard carriage return (Enter) between the previous line and this one will be written to the file as a linefeed (`n). By default, the tab to the left of this line will also be written to the file (the same is true for spaces). By default, variable references such as %Var% are resolved to the variable's contents. )", C:\My File.txt ;ここまで( )まで)は継続セクション
継続セクション
デフォルトでは、継続セクション内の引用符は、エスケープされているかのように動作する
つまり、「"」記号はそのまま「"」として扱われる
さらに、継続セクション内の最初の行のインデントに基づいて、その後の各行の先頭のインデントが省略される
行の始まりがスペースとタブの二つで始まっているとすると、継続セクションの一番先頭の行に用いられているほうが省略される
いずれかの行が最初の行よりもインデントされているか、または間違った文字でインデントされている場合、その行の先行するすべてのインデントは消されず、そのまま残ってしまう
このデフォルトの動作を無効化させたい場合は、セクションの開始括弧の右側に次のオプションの1つ以上を設定すればいい
(LTrim Join|
式(:= 演算子を用いた代入)でも利用が可能だが、引用符の位置に注意が必要。例は↑のex1
継続セクション内にコメントは入れれない、下記に記述するCオプションで指定すれば可能になる
また、[()]から始まる行にはコメントを入れることができる
ex: コメント可能な行には ; 可能と書いてある
FileAppend, ; コメント可能 ; コメント可能 ( LTrim Join ; コメント可能 ; これはコメントにならないで文字列として扱われる ), C:\File.txt ; コメント可能
エスケープシーケンスはそのまま使える(`オプションが指定されている場合を除く)
継続セクションのオプション
継続セクションの動作は、セクションの開始括弧の右側に次のオプションの1つ以上を含めることで上書きできる
複数のオプションが存在する場合は、それぞれのオプションをスペースで区切って記述すればいい
ex:複数のオプションを設定する場合(下記のLTrimとJoinはオプション)
(LTrim Join a b c )
オプション一覧
案の定長いのでたたんでる
オプション | 説明 |
---|---|
Join [文字] |
各行の結合に使用する文字列を改行(\`n)以外に変更する 単にJoinと指定すると、各行がそのまま連結される [文字] には15文字までの文字列が指定できる また、[文字]の部分にはエスケープシーケンスが使用できる セクション内の最後の行もjoinオプションの文字で終了させるには、セクションの閉じ括弧のすぐ上に空白行を入れればいい ex: 以下の例では、各行をスペースで結合するようにしている MsgBox, (Join `s ;`sは半角スペース a b c ) 結合した結果: a b c |
LTrim | 各行の行等の半角スペースや、Tab文字を無視する |
LTrim0 |
LTrimの無効 個別では使わないかなというかどういうときに使うの? |
RTrim0 |
行末の末尾の半角スペースやTab文字を無視しないようにする RTrimはない |
C |
[;]によるコメントを有効にする あくまで[;]によるコメントのみなので、*/\*....\*/の形式のコメントは使用できない** 各行の最後に書いても、改行して単独で書いても問題ない Cの代わりにComments、Comment、Commと書いてもいい |
` | `n、`t などの特殊文字がエスケープ文字としてではなく、そのまま出力されるようになる |
, |
カンマ(,)が自動的に[`,]としてエスケープされるのを抑止する 関数の引数の区切りなどとして扱われるようになる |
Q(またはQuates) |
継続セクションを式で使用する場合で、継続セクション内の引用符で閉じることができるようになる 多分ほとんど使わない ex: Qオプションがない場合とある場合の例 Var := " ;Qなし ( テスト この後の引用符までが文字列として扱われる )" Var := " ;Qあり (Q テスト この後の引用符までが文字列として扱われる" ) ;この括弧の後ろに"をもう一度書くとエラーになる |
) |
継続節(の先頭)ではなく式として再解釈する ただしJoinオプションは除く 多分式が長い場合や継続セクションのオプション(Join)が使いたい場合に有用なのかな 説明わかりにくいし例も例でわけわかめ例や説明いいのあったらいいな ex: [)]の例、この場合括弧をエスケープする必要なく動作するらしく有用みたいよ どの[)]を示してるのかがわからないんだよね (x.y)[z]\() |
その他
書いてあったから一応書くけどもあんまりいらないというか別に今読まなくてもとか
一行は最大16383文字までらしい(そんな書かない気がするんだけど)
関数とは別に「#」で始まるプリプロセッサ指令のようなものがある また、このプリプロセッサ指令のようなものは、スクリプトが実行される前の段階で処理されるので、引数に変数を含めることは出来ない
スクリプトのデバッグ
基本的なデバッグの方法
方法その1
MsgBoxを利用する
スクリプトの要所要所にMsgBox関数を入れて、動作状況や変数の内容を表示させる
例えば、If文の各分岐先にMsgBox関数をいれるなど
ex:要所要所にMsgBox関数を入れたデバッグの方法
if ( a == 1 ) { b := 0 } else { b := 1 }
方法その2
ListVars,Pauseなどの関数を利用する
ListVarsやPauseなどの関数は、スクリプト中の挿入した所に「ブレークポイント」を作成する
スクリプトが上記の2つの関数に遭遇すると、検証のためにすべての変数の現在の内容が表示される
全ての変数が表示されるため、目的の変数のみでいい場合はMsgBox関数を使用するのがよい
再開する準備ができたら、[ファイル]メニューまたは[トレイ]メニューからスクリプトの一時停止を解除する、すると、スクリプトは、次の「ブレークポイント」(存在する場合)に達するまで続く
その他:
これらのデバッグは、アクティブウィンドウが変わってしまうと正常に動作しないようなところでは使用できないので注意が必要である
また、これらのデバックではWinActivate関数の直前など、アクティブなウィンドウがスクリプトに関係しない位置に、これらの「ブレークポイント」を挿入するのが一般的で、こうすれば、スクリプトを再開したときに正常な動作で再開することができる
また、ListLines,KeyHistory,OutputDebug といった関数もデバッグには有用である
誤字や欠落した「グローバル」宣言などの一般的なエラーは、警告を有効にすることで検出できる(デフォルトの状態)
対話型デバッグ
DBGpクライアントを用いた対話型デバッグが可能である
DBGpクライアントを用いてできること
- ブレイクポイントの設置と撤去(ブレイクポイントに達するとスクリプトの実行は一時停止される)
- 1行ずつコードをステップ実行することができる(関数やサブルーチン自体、あるいはそれらをまたいでも可)
- 全て、あるいは特定の変数の検査
- 実行中のサブルーチンや関数のスタックを表示できる
やり方
対話型デバックをするにはまず対応しているデバッガクライアントを起動し、/ Debugコマンドラインスイッチを使用してスクリプトを起動する
ex: AutoHotkey.exe /Debug[=SERVER:PORT] ...
ex: Server および Port は省略可能で、以下の二つは同じ
AutoHotkey /Debug "myscript.ahk" AutoHotkey /Debug=localhost:9000 "myscript.ahk"
実行中のスクリプトにデバッガを接続するには、以下のようにメッセージを送信すればいい
ex:実行中のスクリプトをデバッガに接続
ScriptPath := "" ;スクリプトのフルパスを入れる DetectHiddenWindows On if WinExist("%ScriptPath% ahk_class AutoHotkey") ; オプションの引数: ; wParam = the IPv4 address of the debugger client, as a 32-bit integer. ; lParam = the port which the debugger client is listening on. PostMessage, % DllCall("RegisterWindowMessage", "str", "AHK_ATTACH_DEBUGGER")
その他:
デバッガクライアントが接続されると、"detach" DBGp関数を送信してスクリプトを終了することなく切断されることがある
なおコンパイルしたスクリプトではこの機能は利用できない
コンパイルについては次回のその2で扱っている
autohotkey2.0勉強中(翻訳)その3~リマップ編~
最終更新日: 2017/12/23
目次
はじめに
最後の方訳すのめんどくさくなってきた
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
リマップ編
リマップとはキーボードのキーをの入力を別のキーの入力にすること(みたいな感)
キーの指定の方法はホットキーと同じようにできる
例えば右Ctrlなら>^
基礎
レジストリ書き換えとは異なるため、AHKの指定スクリプトが動作していないとリマップされない
逆にAHKのスクリプトさえ起動していなければ通常のキーとなる
スクリプトの停止を切り替えることによってなんかできるかもね
リマップの仕方
以下のように書けば置換ができる
置換元キー::置換先キー
ex: aキーをbキーに、左Ctrlキーを右Ctrlキーに(適当だから間違ってるかも)
a::b <^::>^
キーの入れ替え
以下のように書くと二つのキーを入れ替えることになる
a::b b::a
a::B
とすると大文字のBが入力される -まあ使わなさそうだけどこんな使い方出来るっていう- コンビネーションキー(&)は設定できない
ex: a & c::b は使えない
マウスのリマッピング
なんでこの表作ったんだろうね
マウスのリマッピング用表
名前 | どのボタンか |
---|---|
LButton | マウスの左ボタン(左クリック) |
MButton | マウスの真ん中のボタン(中クリック) |
RButton | マウスの右ボタン(右クリック) |
XButton1 |
マウスの拡張ボタン1 他ボタンマウスのボタンのことで、OSのデフォルトで戻るに割り当てられているもの |
XButton2 |
マウスの拡張ボタン2 他ボタンマウスのボタンのことで、OSのデフォルトで進むに割り当てられているもの |
WheelUp | ホイールアップ(↑スクロール) |
WheelDown | ホイールダウン(↓スクロール) |
WheelLeft | チルト左(横スクロールの←) |
WheelRight | チルト右(横スクロールの→) |
その他便利事項的な
キーの入力の無効化
以下のように書くとキーの入力を無効化できる
これリマップだと思うんだけどねなんかホットキーに書かれてた
キーの指定::Return
ウィンドウ(ソフト)別に設定したいんだけど
- #IfWinActive等(#IfWinActive/Exist項目)または#ifを使うことで、特定のウィンドウのみに適応できる
まあホットキーの時と一緒で、まだそこまで書けてないからwikiさんでも見てくれれば
日本語wikiさんの#IfWinActiveのページ
なんか正常に動作しないんだけど
ロック系キー(CapsLockなどのロックキー、カタカナ/ひらがなキー)のリマップをしたらおかしくなった
日本語配列では、ロック系キーなどをリマップすることはできないというか推奨されてない
なぜなら、AHK内でUnKnownKeyとして扱われることが多く、動作が不安定になる
例えば、カタカナ/ひらがなキーをリマップしたが、関係ないキーを押した際に勝手にWindowsキーが押されるとか(実際にあった)
これにより、ロック系キーのリマップはレジストリを使うのが良い
リマップしたキーが思ったように動作しないだけど(タイトルつけづらい)
a::b
と置き換えた場合、^a のキーを押したら ^a としては機能せず、^b として機能するので注意
AltキーにリマップしたのにAltTabが動作しない
Altキーになるようにキーまたはマウスボタンをリマップしたとしても、そのリマップしたキーはAltTabの動作をしないことが多いらしい
回避策として、以下のホットキーを追加することで出来るようになるが、本当のAltキーの方でAlt-Tabを実行する際に正常に動作しない可能性がある
まあ推奨しないけどさ、もしこうするなら本当の方を使わないでリマップの方のみでAlt-Tabをやることをお勧めするよ
(こんな感じのこと書いてあった(随分意訳な気がするけど))
そうしたくないならレジストリで設定するか諦めるのがいいんじゃないかな
*Tab :: Send "{Blind} {Tab}"
自動実行セクションにSendModeが書いてある場合
SendModeが自動実行セクション(最上部に書くスクリプトのこと)で使用されている場合は、全てのリマップに影響するらしい
例えば、SendPlayモードを使用している場合で、リマップではSend {Blind}を使用してリマップしているらしく、SPモードでは、{Blind}を完全にサポートしていない
このため、SendPlayモード(特にControl、Shift、Alt、Win)ではリマッピングが正しく機能しないことがあるので注意
この問題を回避するには、スクリプト内にリマップがあるときにSPを自動実行セクションで使用しないこと
そうしても使いたい場合は、スクリプトの別の場所(自動実行セクション以外)でSPを使用する
また、SendEvent(SE)を使用したホットキーを用いたリマップも可能みたいなことが書いてあった
ホットキー用のコマンドがリマップにも影響する
スクリプトのどこかに以下の関数が書いてある場合はそれのせいかもしれない
Suspend関数あるいは、HotKey関数
(使ったことないからわかんないから書けない)
ex: 一応例↓
Suspend "On" Hotkey "*a, off" Hotkey "*a up, off"
リマップの仕組み(応用)
スクリプトが起動されると、各リマップは1組のホットキーに変換されるらしい
たとえば、a :: bのリマップは実際には次の2つのホットキーの組み合わせになっている
*a:: SetKeyDelay -1 ; 置換先キーがマウスボタンの場合、代わりにSetMouseDelayが使用されます Send "{Blind}{b DownTemp}" ; DownTempはDownと似ているが、他のSendコマンドではDownしていないように認識されている点で異なるってさ return *a up:: SetKeyDelay -1 ; これらのSetKeyDelaysのいずれかでpress-durationが指定されていない理由については、下記の注を参照してください。 Send "{Blind}{b Up}" return
説明: (あってるかわかんないけど)
まず最初のホットキー
何かしらのキーと[a]キーが押されたときに{Blind}が送信される {Blind}は現在の各種修飾キー、Capsキーの状態を保持するコマンドみたいなもので、これにより各種修飾キーの状態が保持されたままになる
この状態で、bを送信するので、例えばCtrlが押されたままならCtrl-bの動作になる
二個目のホットキー
[a]キーが離されたときに再度{Blind}を送信する 多分さっき指定した{Blind}の状態を解除しているんだと思う、(公式ヘルプに何も書いてなかったから再度指定する意味が分からないからこんなところかなと)
さっき下げた[b]キーを上げてもとに戻す
ちなみにSetKeyDelay -1 はキーの送信の速度を遅延なしにしている(他の動作に邪魔されないため)
ただし、上記のホットキーは次の状況により違う動作になる
- 置換元キーがLCtrlなどの修飾キーの場合
Send "{Blind} {LAlt DownTemp}"の行がSend "{Blind} {LCtrl Up} {LAlt DownTemp}"に置き換えられる
置換元キーがRCtrlの場合は、{RCtrl up}が使用される以外は同じになる
- マウスのボタン(RCtrl :: RButtonなど)にリマップしている場合
SetKeyDelayの代わりにSetMouseDelayが使用される
さらに、上記の一番最初のホットキーは次のように置き換えられ、キーボードのオートリピート機能によるマウスクリックが繰り返し発生することを防ぐようになっている
*RCtrl:: SetMouseDelay -1 if not GetKeyState("RButton") ; マウスの右ボタンはこの時点ではまだ押し下げられていない Send "{Blind}{RButton DownTemp}" return
注:
上記のホットキーでは、SetKeyDelayの2番目のパラメータ(押下時間)が省略されている
これは、{b down}や{b up}のようなダウンまたは、アップ専用のイベントにはプレス時間が適用されないため
ただし、Shift / Ctrl / Alt / Winキーの状態の変更は、a::B ,a::^bなどのリマップに影響を及ぼすので、スクリプトの自動実行セクションを介して適応された押下時間がリマップ全てに影響を及ぼすため、注意してね的な
カスタムコンビネーションキーをリマップに使用したい
カスタムコンビネーションキーを1つのキーに直接リマップすることはできないが、上記のように、リマップはホットキーに変換されるため、それを利用してあたかもそうかのように設定できるみたい
ex: 例えば、a & c :: b というリマップをしたい場合
上記の *a:: を a & c:: に、また、*a up:: をa & c up:: に変更すればいい
どのような動作をしてるかは↑で既に記述したのでそちらを参照
a & c:: SetKeyDelay -1 Send "{Blind}{b DownTemp}" return *a & c up:: SetKeyDelay -1 Send "{Blind}{b Up}" return
simplenoteさんの勧め
Simplenoteさんを個人的に使っていて結構便利かなと思っているので、勝手ながら紹介させてもらう。
Simplenote公式ページ
サイトは英語で書かれているけどもアプリは(ソフトも?)日本語で書かれているので完全に英語だけってわけではないです。
僕は特に簡単なメモ用に使用しています。
Simplenoteさんの特徴
- 前述したとおりにAndroidもiOSもアプリがありパソコンとスマホ間で書いたノートの内容が共有できる
- パソコンの場合はソフトを入れなくてもWEBアプリでの利用も可能なので手軽
- アカウントでの紐づけで、ネットワーク環境があり、ログインさえできれば、複数のパソコン間でも共有できて非常に便利
- ちなみにパソコンのソフトでは、Windows、Mac、Linuxに対応しています
- また、有料版、有料オプションなどはなく現状完全無料で使える
- 使う上で便利な機能がそろっていて使い勝手がとてもいい
機能面の紹介
- ピン留め
ピン留めするようにしたノートは上位に表示されるようになりアクセスがしやすくなる - Markdownに対応
Markdown形式に対応しているので、Markdownでメモしたくて複数デバイスで共有したいんだって人には最適ではないかと思います。(ほかのやつあるか知らないからいいのあるかもだけど) - Publish機能
ノートをPublishすると、URLが作られ、そのノートを他人に簡単に見せることができる! - リストア(履歴)機能
ノートを以前の状態に戻したい、間違えてしまって消すのがめんどくさいなどの時にこの機能を使えば以前の状態にノートが戻せるのでとても便利です。 - タグ付け機能
各ノートに複数のタグが設定でき、タグで絞り込みをかけることができるので、アクセスがしやすくなっています。 - ゴミ箱機能
言わずもがな、消してしまっても復元できる。さらにリストアと組み合わせると消したものを復元してさらに昔の状態に戻せて地味に便利なことも - Share機能
共有して、他のSimplenoteユーザーと共同編集ができる - zip形式でダウンロード
使ってないからわからないけどzip形式でノート全部?がダウンロードできるのかな