autohotkey2.0勉強中(翻訳)その2~ホットストリング編~
最終更新日:2017/9/17
目次
はじめに
その1のコピペ
翻訳とかあんま得意じゃないんだけど
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
ホットストリング編
ホットストリングとは、打った文字に対して特定の動作をさせる機能のことで、主な用途はホットキー同様になんかしらの動作をさせる
または、その打った文字を特定の文字に置換することができる機能のこと
記述方法はホットキーに似ている
前版のAHKLではUnicode対応で、日本語の置換もできたらしいが、AHK2ではUnicode対応にもかかわらず日本語は文字化けしてしまう(手元の環境でそうなってる)
上記の理由により、文字置換はあんまり有益な使用例はないかなとか
基礎編
ホットストリングは以下のように記述する
::設定したい文字列::置換結果の文字列
ex: endと打ったらendingに置換する例
::end::ending
ex: endと打ったらメモ帳を開く例
::end:: Run, Notepad Return
- ただその文字を打っただけでは動作せず、終了文字を打たないといけない
- デフォルトの終了文字はこいつらで、それぞれ一文字(一つのキー)で終了文字として作用する
終了文字一覧
終了文字一覧
(二個ずつ同じ種類というかグループに分けてあるけど見やすいというか覚えやすいように)
終了文字 | 説明というか名前 |
---|---|
- | バー |
( ) [ ] { } |
各種括弧 |
' " | 一重引用符、二重引用符 |
: ; | コロン、セミコロン |
/ \ | スラッシュ、バックスラッシュ バックスラッシュは日本語環境では半角の¥と同じ |
, . | コンマ(カンマ)、ピリオド |
? ! | 疑問符、感嘆符 |
`n `t | エンター、タブキー |
- 設定で終了文字は変えられる
- #Hotstring EndChars "設定したい文字" のように記述すればいい
- 上の表同様に、tabは`t、enterは`nで書く
オプション
ホットキー同様にホットストリングにもあり、設定できる
ホットストリングでの置換する際の動作が設定できる
例えば入力した文字を消去しない、終了文字を送信しないなど
オプションを個別に指定する場合
各それぞれのホットストリングに対してのみ有効となる
方法はホットストリングの最初の「;」の間にオプションを挟む
ex: 個別に指定する場合、この場合[c]の文字がオプションになる
:c:キー::置換先
以降のすべてのホットストリングに適応する場合
以下の記述をしたらそれ以降のホットストリングにそのオプションが適応される
ex: 以降のホットストリングに適応する例
#Hotstring [cなどのオプション]
ただし、一度設定したらそれ以降のホットストリングに指定したオプションが設定されてしまう為注意
もし特定オプションのみ解除した場合は下記の一覧にあるオプションの取り消しを上記の方法で設定する必要がある
一応例を↓
;オプションcの設定(以降のホットストリング全てに有効) #Hotstring c ::a::abc ;オプションcの解除(以降はcは設定されてないことになる) #Hotstring c0
オプション一覧
- すべてのオプションで後ろに0をつけると取り消しになる
- ただし、b0だけが例外で、bで取り消しになる
オプション一覧
記号(オプション) | その説明及び例 |
---|---|
? | 他の単語などがあっても動作させる
ex: ?を実際に使った例""の部分がホットストリングで変換された部分
:?:al::airlineで設定してあるとして
practic"al"→practic"airline"
|
* | 終了文字を不要で動作させる つまり指定したテキストを打ったら勝手に動作するということ まあ特定条件とか(#IfWinActive)でなら使えるかもねっていうやつ |
b0 | 入力した文字を消さず、そのまま残す つまり置換しなくて、その後ろに指定した単語を追加する形 このオプションはbで取り消しになる |
c | 大文字小文字を区別するようにする ex: intならIntegerに置換されるが、INT,iNt,Int,inTなら置換されない
:c:int::Integer
|
c1 | 大文字小文字を区別しないが、置換する際にn文字目が大文字なら置換後の文字も大文字になるらしい 手元の環境で試したらならなく、どんなパターンでも登録された形に置換された もしかして 訳ミス ex: intと打ったらIntegerにINTと打ったらINTegerになる
:c1:int::Integer
|
Kn | 遅延を指定することができる、稀にしか使わない 使うときはだいたいゲーム関連か正常に動作しない時とか また、どの送信モード(Sendコマンドのモード)かによって動作が異なる SI: 遅延は無効化される、使えないから SP: デフォルトは0で-1と同等 SE: デフォ0の-1は完全に遅延なし |
o | 自動置換で終了文字を打った際に終了文字を入力しないようにする 例えば置換対象のテキストを打った後にEnterを打って置換をするとすると、置換はされていいもののEnterが打っていることになり、改行されてうざいとかのときに有用かな |
Pn | 優先度を指定できる まああんまり使わないかなと |
R | 置換後のテキストで{Enter}のような特殊キーの解釈を行わず、そのまま置換する ex: 以下の場合Rのオプションを使用しない場合は{Enter}がそのまま置換されず{Enter}キーが送信されてしまう
:R:ent::{Enter}
|
z | 設定したホットストリングが発生した時点で、キー入力の記憶バッファをクリアする つまり、以前に入力したものを考慮しなくなり、不要なホットストリングの発生を抑えれる 以下のような場合に使用するらしい
ex::b0 *?:11 ::
SendInput xx
Return
上記の場合zオプションがないため、111を入力すると、
最初と二個目の11、二個目以降の11の二つで、ホットストリングが2回発生してしまうらしいこれを回避するためにzオプションを使用するらしい |
なんか各種送信モードも書いてあったから別途表にした
一応後に出てくる?Sendコマンドのモードなんですがまあいいや
各種送信モード
送信モードの名前 | その内容等 |
---|---|
SI(SendInput) | 入力速度が全モード中最速で、実行中はユーザーのキー入力は一切受け付けずに終了後に入力される デフォルトの送信モードはこれになっている |
SP(SendPlay) | 一遍にウィンドウにキーが送られるため、やや遅めである、SEの一部設定よりも速いが、SIよりは遅い 一度に送信するため、ゲームのコマンドなどに有用 |
SE(SendEvent) | 一定の間隔をあけるながら、個々の操作イベントを生成する つまり、一つづつキーを送るてきなことだと解釈してる 操作の再生中にユーザーによる操作の割込みが発生する可能性があるからこのモードを使用するなら注意してだって |
その他基本事項
- デフォルトの状態では、ホットストリングの入力文字の判定が大文字小文字を判定しないものになっている
- これにより、例えば下記の例ではEndでもendでもホットストリングが動作する
- また、一つでも小文字なら置換後のテキストはそのままの形だが、全部大文字なら置換後のテキストもすべて大文字になる
- 下記の例ならENDのみENDINGとなる
::end::ending
- {Enter}などの特殊キーはそのまま特殊キーが送信される
- 特殊キーはホットキーの修飾キーや、Enter,Tabキーなど
ex: entでエンターキーが送信される
::ent::{Enter}
- 変数はサポートしていない
- 設定できる置換元の文字上限は40文字
- ちなみにその逆の置換先の文字数上限はたしか4万とかだった
- ホットストリングを複数書いた場合↑にあるホットストリングほど優先順位が高い
- スペースかタブを置換後テキストの最後に入れたい場合はスペースかタブを最後に入れてそのあとに`をつける
ex: :*:btw::By the way \`
- マウスのクリックによってホットストリングの判定は解除されてしまう為以下のことが起こるので注意
- ?オプションがなくてもホットキーの発動が起こる
- 前回まで打っていた文字の判定がリセットされるので次に続きを打っても変換されない
- #Hotstring NoMouseをスクリプトの先頭にでも書いておくことで、マウス自体をホットストリングで無効化にできるみたいで、問題を回避できる
- ビルトイン変数A_EndCharには終了文字が入っていて入力した終了文字によって操作を変えたい、終了文字を送信したい等に使える
ex: 終了文字を送信する場合
SendRaw %A_EndChar%
上記でSendRawを使う理由は!{}などの文字が通常のSendコマンドによって正しく送信されないから
- スペースとタブは文字として扱われる
ex:
::btw::by the wayと::btw::" "by the wayは異なる
- 矢印キー、PageUp、PageDown、Home、Endをエディタ内で使うと判定がリセットされる
- どんなウインドウでもホットストリングの対象となるため文字入力画面以外でも発動する
- GosubまたはGotoには、最初のコロンのペア(オプション記号を含む)と名前で、ホットストリングのラベルとすることができる
ex: Gosub :: xyz
エスケープシーケンス
一部文字はエスケープシーケンスを用いないと使えない
(プログラム書いてる人とかにはおなじみだけども)
詳細は以下参照
詳細は「エスケープシーケンス」を参照(後ほど作るかな)
その他便利事項
ホットストリングで置換した後に文字消したいんだけど、カーソルの位置を動かしたいんだけど
- {bs 数}: その数バックスぺースで後ろから文字を消す
- {left 数}: 左にその数移動する
- {right 数}: 右にその数移動する(これいるのかな)
あくまでこれらは置換した後に動作するものになるので、入力文字列を置換したくない場合はb0オプションをつけること
また、これらを使う場合はたぶん終了文字打つのが邪魔になるから * オプションと組み合わせるといいんじゃないかな
ex: ()を打った際に一つ←に移す、b0は()を消去しないために
:b0:()::{left 1}
ウィンドウ(ソフト)ごとに個別でホットストリングの設定がしたいんだけど
#IfWinActive、#IfWinExistを使うことで、特定のウィンドウのみに適応できる
一応説明と例を書いておくと
#IfWinActive, [ウィンドウの指定] ホットストリング
こんな感じの書き方をすることにより#IfWinActive以下のホットストリングは#IfWinActiveで指定したウィンドウでのみ動作するようになる
一度指定したら次に#IfWinActiveで指定しなおすまでの間に書かれているホットストリングすべてに有効になる
また、#IfWinActiveのみの記述をウィンドウを指定した後に用いることで、グローバルホットストリングに戻せる
ex:以下はメモ帳が開いてる時のみのホットキーの設定
#IfWinActive, ahk_class Notepad ^a::MsgBox You pressed Ctrl-A while Notepad is active. #c::MsgBox You pressed Win-C while Notepad is active.
詳細はいつかここに書くか個別で書くかしたいな
まだそこまで書けてないからwikiさんでも見てくれれば
日本語wikiの#IfWinActiveのページ
一応、詳細は#IfWinActive/#IfWinExistを参照 ←まだ
autohotkey2.0勉強中(翻訳)その1~ホットキー編~
最終更新日:2017/12/23
目次
そもそもautohotkeyについて
autohotkey(以下AHK)さんとは→windowsのソフトウェアでスクリプトを書いてahk.exeで実行させるといろいろできる優れもの
ホットキーやホットストリングなどの機能があり、とても便利なソフト。
まあいろいろ試しながら少しづつやってみると楽しいソフトだと思うよ、
詳しくは検索してほかの人の紹介見たほうが早いと思う。
お世話になってるから紹介書いてもいいかも(見る人いないだろうけど)
はじめに
翻訳とかあんま得意じゃないんだけど、とりあえずホットキーの所らへん自分なりにまとめたやつ
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)
一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う
参考:ahkwiki日本版様及び公式ヘルプ
ホットキー編
ホットキー編のこの単独ではほとんどなにもできないのでスクリプトあたりまで読まないといけない
基礎編
最も基本的なホットキーの書き方
ホットキーの定義の仕方は、スクリプトの任意の場所に以下のように記述すればいい
キーの指定::させたい動作
ex:windowsキーにnキーを押したらメモ帳の起動をする動作
(まだ書かれている意味はわからなくてもよい)
一応説明入れると
Run, [プログラム等のパス] でプログラム(exe)、batなどのスクリプト等の関連付けされているものが実行できる
パスは基本的に絶対パスだが、記述しているスクリプトをカレントディレクトリと
して記述できる、および、c:\windows\配下はそのまま記述できる
#n::Run Notepad
させたい動作にはスクリプトを記述する
スクリプトに関してはスクリプト編を参照
キーの指定方法
以下の2つの指定方法が基本的な指定方法になってるのでこれ覚えればおk
- [a,bなどの普通のキー]
- [修飾キー]+[a,bなどのそれ以外の普通のキー] の組み合わせ
修飾キーとは、他のキーの入力文字や機能を変えるために併用するキーのことで、後述する
ex:一つのキーでのホットキーの指定と修飾キーを用いたホットキーの指定の例
aキーでの指定方法 a::なんちゃら windowsキーとaキーでの指定方法 #a::なんちゃら Ctrlキーとaキーでの指定方法 ^a::なんちゃら
修飾キー一覧
文字 | キー |
---|---|
# | Windowsキー |
^ | Controlキー |
! | Altキー |
+ | Shiftキー |
その他基本事項
- 同じホットキーは書けない(「キーの指定」が同じものは二つ書けない)、AHKさんに怒られます(´・ω・`)
- 複数のホットキーを書いた場合↑にあるホットキーほど優先順位が高い
複数行の動作をさせたい場合
- 一行(1コマンド)ならそのまま右に書けばいいが、複数行なら改行して、一行下から動作を書き、最後にReturnを記述しないとだめなのだ
Returnにぶつかるまで処理を継続するため、最後にReturnを記述しないとそれ以降に記述した動作(ホットキーなど)が実行されてしまうので注意
一行の場合
[キーの指定]::処理
- 複数行の場合
[キーの指定]:: させたい動作を 複数行書く 最後に必ずReturnを書くこと Return ;←こいつ重要
ex:windowsキーにnキーを押したらメモ帳を二つ起動をする動作 まだ書かれている意味はわからなくてもよい
#n:: Run Notepad Run Notepad Return
キーの入力の無効化
以下のように書くとキーの入力を無効化できる
これリマップだと思うんだけどねなんかホットキーに書かれてた
キーの指定::Return
ホットキーに対するオプションの指定
ホットキーに対して以下のようなオプションが設定できる
例えば、Ctrlキーなどの左右の指定ができる、修飾キーのワイルドカード指定ができるなど
基本的にオプションは各ホットキーの[キー指定部分]の前につける
それぞれ使用方法を添付してあるのでそちらを見て欲しい
[オプション][キー指定]::動作
オプション一覧
上にあるほど大事な奴というか一番↓があんまり使わない?っていうだけだけど
オプション | 機能 |
---|---|
< | 左のキーを指定 ex: <!a:: 左Alt+A
|
> | 右のキーを指定 ex: >^a:: 右Ctrl+A
|
* | 任意の修飾キーを表すワイルドカード ex: *a:: (Ctrl/Alt/Shift/Win)+Aキーが押されたら発動このオプションを指定したホットキーがある場合、そのホットキーは常にAHKによって乗っ取られる *a::のホットキーがある場合、^aなどはAHKに乗っ取られる Tips:正しく言うと、キーボッドフックが使われるということ |
~ | イベントを乗っ取らず、そのままシステム(ソフト)に通す つまり、AHKで設定したホットキーによって設定したキーがソフトとかに送信されないことを回避するためにホットキーの前につける ex: ~#e::なんちゃら また、そのキーが離された時ではなく、押された瞬間にシステムに送られる Alt+Tab代替系コマンドが割り当てられた場合、このオプションに関係なく入力は乗っ取られる 複数の「aキーを一つ目のキー(修飾キー)として設定したホットキー」がある場合でaキーが乗っ取らないように「~」をつける場合いずれか一つのホットキーに設定するだけでよい (どれか一つのホットキーにつけておけばよい) ex: ~a & s ::なんちゃら Tips:どれか一つのホットキーに対してこのオプションが指定されるとそのキーに対してキーボッドフックが使われる |
& |
&を使うことで、2つの任意のキー(ジョイスティック以外)の組み合わせをホットキーに指定することが可能 使用する際は「&」の前後に半角スペースを一つ入れないといけない←これ大事 ex: a & {Left}::なんちゃら この場合はaを修飾キーとして←キー(矢印キーの左)を押すとなんちゃらが実行される3つ以上のキーを指定したり、+^!# で修飾キーを追加したりは出来ない 一つ目に指定したキーが修飾キーとなり、一つ目のキーを押しながら二つ目のキーを押すと発動する 一つ目のキーを押して、ホットキーを発動させずに離すと、一つ目のキー単独に割り当てられたホットキー(正確にはサブルーチン)が実行される AHKに一つ目のキーを乗っ取られるため、一つ目のキー自体のもともとの機能は無効化される 一つ目のキーにチルダ(~)をつければ、そのキーは無効化されず、普通に入力される ex: ~ a & b :: なんちゃら
|
Up | >
キー名の後に半角スペースに続いて Up とつけると、キーを放したときに発動するホットキーを設定できる ex: LShift Up ::なんちゃら Upなしのホットキーが既に存在していても設定することが可能 Upなしのホットキーを設定していない場合でも、押し下げイベントも乗っ取られる たとえばa up::Send b とすると、aキーを押し下げたときもAHKに乗っ取られるのでaキーの入力がまったく出来なくなる これを回避するにはupを設定したホットキーに対して~オプションを指定する ex: ~Shift Up ::なんちゃら |
$ | Sendキーを用いて送信したキーをホットキーに使用する場合につける
RegisterHotkey()とは異なり、強制的にキーボードフックでイベントを取得する それによりSendコマンドがキーボードフックを使用できなくなる サブルーチン内でそのホットキー自身を送信する場合、RegisterHotkey()ではホットキーイベントが再帰的に呼び出されてしまう問題を回避できる的なこと書いてあった このオプションは、このホットキーの定義上のどこかに#UseHookを指定したことに相当するみたいで、#UseHook指令を使えば、$を省略できる マウスのホットキーには効果がない(マウスのホットキーは常にマウスのフックを使用するから) チルド(〜)やワイルドカード(*)、キーアップホットキー、およびカスタム組み合わせを含むキーボードホットキーなど、キーボードフックを必要とするホットキーには効果がない #InputLevelとSendLevelは、送信コマンドによってどのホットキーとホットストリングが実行されるかをさらに制御するらしい Tips:ListHotkeysを使用することで、特定のホットキーがキーボードフックを使用するかどうかを判定出来る |
その他便利事項的な
AltTabの動作をさせたいんだけど
AltTab関連は以下の4つがあり、そのまま書けばいい
- AltTab
- Alt+Tabを押したときの動作をする
- ただし、&を用いた2つのキーでの使用でしか動作せず、AltTabのメニューがすでに開いている場合は消すことに、開いてない場合は表示をする動作をする(使うのかな?)
- ShiftAltTab
- Shift+Alt+Tabを押したときの動作(AltTabの逆の動作)になる
- AltTabMenu
- Alt+Tabを押したときのメニューを表示させる
- AltTabMenuDismiss
- Alt+Tabを押したときのメニューを非表示させる
ex:これでAltTab等の動作をするってさ
>Alt & j::AltTab >Alt & k::ShiftAltTab
Windowsの標準のホットキーを上書きしたいんだけど
管理者権限でAHKのスクリプトを起動することでWindowsの標準のホットキーを上書きすることができる
ex: エクスプローラーを起動するホットキーを上書きしてメモ帳を起動させる
#e::Run NotePad
ただし、#Lなどの一部のホットキーは上書きすることができない
あとなんか開いてるウィンドウとかによってはごく稀に標準のに戻ることもあるけどほとんど起きない
#LはWindowsのロックが強制的に作動するうざい
Num,Caps,ScrollLockを押しっぱなしにしたいんだけど
それぞれ上からCaps、NumLock、ScrollLockの状態を設定する [, State]の部分にAlwaysOn,またはAlwaysOffで常時ON,Offに設定できる SetCapsLockState [, State] SetNumLockState [, State] SetScrollLockState [, State]
ホットキーで設定したキーが押されてることによって正常に動作しないんだけど
KeyWait [キーの指定] U/D を用いることでキーが開放(Up)、または押されるまで待機することができる
ex: 以下のホットキーではホットキーの起動にAlt,Ctrlを使用しているため、どちらも押されたままになってしまい、Ctrl Alt Del の動作をしてしまう
!^s::Send {Delete}
KeyWaitを下記のように用いることで、Ctrl Alt Del の動作になることを回避でき、Deleteキーのみの送信にできる
ここではUpを待つため、Upを省略できる(している)
(Send, {キーの指定}はキーを送信する(押す)機能(関数))
!^s:: KeyWait Control KeyWait Alt Send, {Delete}
ウィンドウ(ソフト)ごとに個別でホットキーの設定がしたいんだけど
#IfWinActive、#IfWinExistを使うことで、特定のウィンドウのみにホットキーを適応できる
一応説明と例を書いておくと
#IfWinActive, [ウィンドウの指定] ホットキー
こんな感じの書き方をすることにより#IfWinActive以下のホットキーは#IfWinActiveで指定したウィンドウでのみ動作するようになる
一度指定したら次に#IfWinActiveで指定しなおすまでの間に書かれているホットキーすべてに有効になる
また、#IfWinActiveのみの記述をウィンドウを指定した後に用いることで、グローバルホットキーに戻せる
ex:以下はメモ帳が開いてる時のみのホットキーの設定
#IfWinActive, ahk_class Notepad ^a::MsgBox You pressed Ctrl-A while Notepad is active. #c::MsgBox You pressed Win-C while Notepad is active.
詳細はいつかここに書くか個別で書くかしたいな
まだそこまで書けてないからwikiさんでも見てくれれば
日本語wikiの#IfWinActiveのページ
カスタムコンビネーションを三つにしたいんだけど
3つ以上のキーの組み合わせはサポートされていないんだけどもね
通常、#IfとGetKeyStateを使用して指定キーが押されたかの検出を行うことによって擬似的にというかそんな感じに3つのカスタムコンビネーションを実現できるみたいなんだけど
思った通りに動作しないこととか、確実に動作するとは限らないとか書いてあった(使ったことないからわかんない)
ex: メニューキー(右Altキーの右隣のキー)とAltキーと/キーのホットキー
#if GetKeyState("AppsKey", "P") Alt & /::MsgBox Hotkey activated.
ex: 上記同様のホットキーだが、最初のGetKeyStateがAltのため、ALtキーを最初に押さないといけない(Altキーが修飾キーになるてきな)
#if GetKeyState("Alt", "P") AppsKey & /::MsgBox Hotkey activated.
ex: [キーと]キーと\
こういう書き方もできるらしい
#if GetKeyState("[") && GetKeyState("]") \::MsgBox
ていうか公式さんに書いてなかったけどもGetKeyStateじゃなくてKeyWaitでもできるんじゃねっていう感じがする
まあ試してないけども
その他
- マウスのクリック、スクロール、ジョイスティック、ナムパッドなども設定できる 詳細はwikiさんのキーリストの項目を見るといいかな
- 「%」記号を用いた変数展開が有効 詳細は「変数」を参照
Fnキーの送信は全部の方法試してないけど正常に機能しないみたい
すでに呼び出されているメソッドをサブルーチンとして呼び出すことができる