のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いていますねー。困った人の役とかに立てばいいかなー。とかそういう程度の奴でーす。むぎゅぎゅ~。更新停滞中ですね~。

autohotkey2.0勉強中(翻訳)その4-1~スクリプト編その1~

最終更新日: 2017/12/23

前→(リマップ編)

目次

はじめに

その1ではスクリプトの基礎編として知っておくべき事柄を抜擢して並べてみた
(エスケープシーケンス入ってないけど)
内容としては以下の通りになっている
AHKの最新版(a081)では全ての関数が関数(function)に変更され、第一引数との間のカンマが不要になっているなど変更点あり
また、エスケープシーケンスも異なる仕様になったので注意

  1. スクリプトの書き方
  2. 自動実行セクション
  3. コメントの書き方
  4. エスケープシーケンス
  5. 行を複数行に分割する方法
  6. 継続セクション(分割の一部)
  7. デバッグ

その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通りある
スクリプトを書いたときにどんなことをするために書いたのか、戻る値がなんなのかなどを書いておくことに使う

  1. 行頭がセミコロン「;」の行はコメント
  2. 関数のあとに半角スペースを空けてセミコロンがあれば、それ以降は行末までコメント(行コメント)
  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関数を入れたデバッグの方法

変数 "a" の内容によってifで分岐するのだが、ifの中の動作が変数を操作するなど、視覚的でない場合、どっちに分岐したかわからないとか、ifのあとでの変数の値(中身)を見たいとか

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で扱っている

スクリプト編その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

説明: (あってるかわかんないけど)

まず最初のホットキー

  1. 何かしらのキーと[a]キーが押されたときに{Blind}が送信される {Blind}は現在の各種修飾キー、Capsキーの状態を保持するコマンドみたいなもので、これにより各種修飾キーの状態が保持されたままになる

  2. この状態で、bを送信するので、例えばCtrlが押されたままならCtrl-bの動作になる

二個目のホットキー

  1. [a]キーが離されたときに再度{Blind}を送信する 多分さっき指定した{Blind}の状態を解除しているんだと思う、(公式ヘルプに何も書いてなかったから再度指定する意味が分からないからこんなところかなと)

  2. さっき下げた[b]キーを上げてもとに戻す

ちなみにSetKeyDelay -1 はキーの送信の速度を遅延なしにしている(他の動作に邪魔されないため)

ただし、上記のホットキーは次の状況により違う動作になる

  1. 置換元キーがLCtrlなどの修飾キーの場合

Send "{Blind} {LAlt DownTemp}"の行がSend "{Blind} {LCtrl Up} {LAlt DownTemp}"に置き換えられる
置換元キーがRCtrlの場合は、{RCtrl up}が使用される以外は同じになる

  1. マウスのボタン(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

次→(autohotkey勉強中その4-1)

simplenoteさんの勧め

Simplenoteさんを個人的に使っていて結構便利かなと思っているので、勝手ながら紹介させてもらう。
Simplenote公式ページ
サイトは英語で書かれているけどもアプリは(ソフトも?)日本語で書かれているので完全に英語だけってわけではないです。
僕は特に簡単なメモ用に使用しています。

Simplenoteさんの特徴

  • 前述したとおりにAndroidiOSもアプリがありパソコンとスマホ間で書いたノートの内容が共有できる
  • パソコンの場合はソフトを入れなくてもWEBアプリでの利用も可能なので手軽
  • アカウントでの紐づけで、ネットワーク環境があり、ログインさえできれば、複数のパソコン間でも共有できて非常に便利
  • ちなみにパソコンのソフトでは、WindowsMacLinuxに対応しています
  • また、有料版、有料オプションなどはなく現状完全無料で使える
  • 使う上で便利な機能がそろっていて使い勝手がとてもいい

機能面の紹介

  • ピン留め
    ピン留めするようにしたノートは上位に表示されるようになりアクセスがしやすくなる
  • Markdownに対応
    Markdown形式に対応しているので、Markdownでメモしたくて複数デバイスで共有したいんだって人には最適ではないかと思います。(ほかのやつあるか知らないからいいのあるかもだけど)
  • Publish機能
    ノートをPublishすると、URLが作られ、そのノートを他人に簡単に見せることができる!
  • リストア(履歴)機能
    ノートを以前の状態に戻したい、間違えてしまって消すのがめんどくさいなどの時にこの機能を使えば以前の状態にノートが戻せるのでとても便利です。
  • タグ付け機能
    各ノートに複数のタグが設定でき、タグで絞り込みをかけることができるので、アクセスがしやすくなっています。
  • ゴミ箱機能
    言わずもがな、消してしまっても復元できる。さらにリストアと組み合わせると消したものを復元してさらに昔の状態に戻せて地味に便利なことも
  • Share機能
    共有して、他のSimplenoteユーザーと共同編集ができる
  • zip形式でダウンロード
    使ってないからわからないけどzip形式でノート全部?がダウンロードできるのかな

Sublime Textの有料版買ってね!!が表示されたら閉じるのをahk2で作ってみた(勉強中)

はじめに

まあ無料で使えるなら無料で使い倒そうという魂胆で使っていますが、
まだ使い始めたばかりなのでそんなにがっつりやってるわけでもなく。
初心者なのでそのうち使いこなしてSublimeさんに恋をしたら有料版買おうかなって思っているので取り合えず邪魔なので消させてもらう。
決して有料版を買わないようにの催促ではないのでお金ある人は買ってあげて(ボソッ

学習中の身のため間違えることが多いので、もし動作しないことや間違い等があったら指摘してくれるとありがたいです。(説明内容含む)、また、正常に動作する保証はありません
間違えたコードは何個かまでは履歴として残して勉強用(戒め)に使ってますので間違えてコピペしてしまうと動作しないぞこのやろってなります。

autohotkeyさんについては検索してもらえれば良い紹介文でもあるかと思います。

取り合えずSublime Textさんの紹介

Sublime Text公式ホームページ
恋に落ちるテキストエディタというキャッチコピーのテキストエディタソフトです。
まだそんな使いこなしてないからがっつり紹介はできないけども高機能でpackageを追加することで色々カスタマイズできるんだよね、そのくせ軽いわ軽いわ。プログラミングの入門とかで使うエディタとしては結構いいんじゃないかな。まあそんなとこ

以下ahk2(autohotkey2)のコード
これ単独では完全に機能しないので別途ソフト起動時に呼び出すものがいります。

改善版

SetTitleMatchMode, 3
    ProcessExist,ids,sublime_text.exe
    countersi := 0
    while(ids <> 0 and countersi < 100){
        ProcessExist,ids,sublime_text.exe
        Sleep, 1000
        If WinExist("This is an unregistered copy ahk_class #32770")
            WinClose
        countersi++
    }
    If (ids <> 0){
        Reload
    } else {
        Return
    }

説明入れると、プロセスが存在する限りwhileループするようにして、その中の最後にカウンターとして変数をインクリメントで一つずつ増加させていって100回ループしたらこのスクリプトを再起動させるようにして正常に起動するように保っている(なんか時間たった時だったかなんかのときにsublimeさん終了されててプロセスないのにスクリプトが終わんなかったから)

追記

5/31 コード大幅に変更、ahkclassだけだとwordかなんかのやつも勝手に閉じられて困ってたからsublimeさんがアクティブだった時だけって思ってたけど完全一致で指定すれば被らないじゃんってことで簡素なのになった
削除要請等あったら消します

ていうかあまり賢くない方法でやってる気が…まあいいか。
Vimに乗り換えたのでもう使ってないのでー。

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
  • 使用できるキーはwikiさんのキーリスト参照してくださいな (そのうちリストの表のページ多分作るけども)

エスケープシーケンス

一部文字はエスケープシーケンスを用いないと使えない
(プログラム書いてる人とかにはおなじみだけども)
詳細は以下参照

日本語版wikiさんのエスケープシーケンス

詳細は「エスケープシーケンス」を参照(後ほど作るかな)

その他便利事項

ホットストリングで置換した後に文字消したいんだけど、カーソルの位置を動かしたいんだけど
  • {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を参照 ←まだ

次→(リマップ編)

Win10-1703でrainmeterがインストールできなかった

rainmeterさんがインストール出来なかったことについて

win10対応してるって書いてあったんだけどもインストーラー実行してもwin7のSP1が必要だよっていう表記が出るっていうなんじゃそりゃってなった件 f:id:ryuugekisya:20170527191722p:plain

取り合えずプロパティ開いて互換性でwin7win8にしてみるもできなかった。(管理者もダメだった気がする)( ;∀;)

f:id:ryuugekisya:20170527192304p:plain

トラブルシューティングやったらインストール出来た(´・ω・`)
win8ならできるよーってなったんだけどもなんでさっき出来なかったんですかねぇ…っていう謎

まあ同じ内容で悩んでいる人がいるならっていう記事?

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 ::なんちゃら
a & x ::なんちゃら

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つがあり、そのまま書けばいい

  1. AltTab
    • Alt+Tabを押したときの動作をする
    • ただし、&を用いた2つのキーでの使用でしか動作せず、AltTabのメニューがすでに開いている場合は消すことに、開いてない場合は表示をする動作をする(使うのかな?)
  2. ShiftAltTab
    • Shift+Alt+Tabを押したときの動作(AltTabの逆の動作)になる
  3. AltTabMenu
    • Alt+Tabを押したときのメニューを表示させる
  4. 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さんのキーリストの項目を見るといいかな

ahkwiki日本語版キーリスト

  • 「%」記号を用いた変数展開が有効 詳細は「変数」を参照
  • 式(:= 演算子を用いた代入)でも利用が可能 詳細は「」を参照

  • Fnキーの送信は全部の方法試してないけど正常に機能しないみたい

  • すでに呼び出されているメソッドをサブルーチンとして呼び出すことができる

次→(ホットストリング編)