のら(NORA)のブログ

主にソフトについて備忘録で(手抜き)書いているのです!ご自由に観覧しやがれ、です。

autohotkey2.0勉強中(翻訳)その1(ホットキー編)

最終更新日:2017/9/16

目次

そもそもautohotkeyについて

autohotkey(以下AHK)さんとは→windowsのソフトウェアでスクリプトを書いてahk.exeで実行させるといろいろできる優れもの
ホットキーやホットストリングなどの機能があり、とても便利なソフト。
まあいろいろ試しながら少しづつやってみると楽しいソフトだと思うよ、 詳しくは検索してほかの人の紹介見たほうが早いと思う。
お世話になってるから紹介書いてもいいかも(見る人いないだろうけど)

はじめに

翻訳とかあんま得意じゃないんだけど、とりあえずホットキーの所らへん自分なりにまとめたやつ
間違いあったらコメくれれば訂正します。というか自分も間違えて覚えてしまうから(´・ω・`)

一応各説明ごとに例は必ず一つ入れている
手抜きだからかなり見にくいかも
定期的に修正入ると思う

参考:ahkwiki日本版様及び公式ヘルプ

ホットキー編

ホットキー編のこの単独ではほとんどなにもできないのでスクリプトあたりまで読まないといけない

基礎編

最も基本的なホットキーの書き方

ホットキーの定義の仕方は、スクリプトの任意の場所に以下のように記述すればいい

キーの指定::させたい動作

ex:windowsキーにnキーを押したらメモ帳の起動をする動作
(まだ書かれている意味はわからなくてもよい)

一応説明入れると

Run, [プログラム等のパス] でプログラム(exe)、batなどのスクリプト等の関連付けされているものが実行できる
パスは基本的に絶対パスだが、記述しているスクリプトをカレントディレクトリと して記述できる、および、c:\windows\配下はそのまま記述できる

#n::Run Notepad

させたい動作にはスクリプトを記述する
スクリプトに関してはスクリプト編を参照

キーの指定方法

  • [a,bなどの普通のキー]
  • [修飾キー]+[a,bなどのそれ以外の普通のキー] の組み合わせ

修飾キーとは、他のキーの入力文字や機能を変えるために併用するキーのことで、後述する

ex:一つのキーでのホットキーの指定と修飾キーを用いたホットキーの指定の例

aキーでの指定方法
a::なんちゃら

windowsキーとaキーでの指定方法
#a::なんちゃら

Ctrlキーとaキーでの指定方法
^a::なんちゃら

修飾キー一覧

文字 キー
# Windowsキー
^ Controlキー
! Altキー
+ Shiftキー

その他基本事項

  • 同じホットキーは書けない(「キーの指定」が同じものは二つ書けない)AHKさんに怒られます(´・ω・`)
  • 複数のホットキーを書いた場合↑にあるホットキーほど優先順位が高い
複数行の動作をさせたい場合
  • 一行(1コマンド)ならそのまま右に書けばいいが、複数行なら改行して、一行下から動作を書き、最後にReturnを記述しないとだめなのだ
  • 最後にReturnを記述しないとそれ以降に記述した動作(ホットキーなど)が実行されてしまうので注意
[キーの指定]::
させたい動作を
複数行書く
最後に必ずReturnを書くこと
Return ;←こいつ重要

ex:windowsキーにnキーを押したらメモ帳を二つ起動をする動作 まだ書かれている意味はわからなくてもよい

#n::
Run Notepad
Run Notepad
Return
キーの入力の無効化

以下のように書くとキーの入力を無効化できる
これリマップだと思うんだけどねなんかホットキーに書かれてた

キーの指定::Return

ホットキーに対するオプションの指定

ホットキーに対して以下のようなオプションが設定できる
例えば、Ctrlキーなどの左右の指定ができる、修飾キーのワイルドカード指定ができるなど

基本的にオプションは各ホットキーの[キー指定部分]の前につける
それぞれ使用方法を添付してあるのでそちらを見て欲しい

[オプション][キー指定]::動作
オプション一覧

上にあるほど大事な奴というか一番↓があんまり使わない?っていうだけだけど

>
オプション機能
< 左のキーを指定
ex: <!a:: 左Alt+A
> 右のキーを指定
ex: >^a:: 右Shift+A
* 任意の修飾キーを表すワイルドカード
ex: *a:: (Ctrl/Alt/Shift/Win)+Aキーが押されたら発動
~ イベントを乗っ取らず、そのままシステム(ソフト)に通す
つまり、AHKで設定したホットキーによって設定したキーがソフトとかに送信されないことを回避するためにホットキーの前につける
ex:~#e::なんちゃら
また、そのキーが離された時ではなく、押された瞬間にシステムに送られる
Alt+Tab代替系コマンドが割り当てられた場合、このオプションに関係なく入力は乗っ取られる
複数の「aキーを一つ目のキー(修飾キー)として設定したホットキー」がある場合でaキーが乗っ取らないように「~」をつける場合いずれか一つのホットキーに設定するだけでよい
(どれか一つのホットキーにつけておけばよい)
ex:~a & s ::なんちゃら
a & x ::なんちゃら
& &を使うことで、2つの任意のキー(ジョイスティック以外)の組み合わせをホットキーに指定することが可能
使用する際は「&」の前後に半角スペースを一つ入れないといけない←これ大事
ex:a & {Left}::なんちゃら この場合はaを修飾キーとして←キー(矢印キーの左)を押すとなんちゃらが実行される
3つ以上のキーを指定したり、+^!# で修飾キーを追加したりは出来ない
一つ目に指定したキーが修飾キーとなり、一つ目のキーを押しながら二つ目のキーを押すと発動する
一つ目のキーを押して、ホットキーを発動させずに離すと、一つ目のキー単独に割り当てられたホットキー(正確にはサブルーチン)が実行される
AHKに一つ目のキーを乗っ取られるため、一つ目のキー自体のもともとの機能は無効化される
一つ目のキーにチルダ(~)をつければ、そのキーは無効化されず、普通に入力される
ex: ~ a & b :: なんちゃら
Up キー名の後に半角スペースに続いて Up とつけると、キーを放したときに発動するホットキーを設定できる
ex: *LWin Up ::なんちゃら
Upなしのホットキーと共に設定することも可能
Upなしのホットキーを設定していない場合でも、押し下げイベントは乗っ取られる
たとえばa up::Send b とすると、Aキーを押し下げたときもAHKに乗っ取られるので何も起こらなくなる
~a::Return を上記と共に設定しておくと、Aキーが押し下げられたときには普通にAキーが押されたときの動作をするようになる。
押し上げイベントは、 ~ の有無にかかわらず、乗っ取られずにシステムに通知される
これにより、LShift Up::Return のようにしても、LShiftキーを離せなくすることはできない
$ Sendキーを用いて送信したキーをホットキーに使用する場合つける
RegisterHotkey()ではなく、強制的にキーボードフックでイベントを取得する
それによりSendコマンドがキーボードフックを使用できなくなる
サブルーチン内でそのホットキー自身を送信する場合、RegisterHotkey()ではホットキーイベントが再帰的に呼び出されてしまう問題を回避できる的なこと書いてあった
このオプションは、このホットキーの定義上のどこかに#UseHookを指定したことに相当するみたいで、#UseHook指令を使えば、$を省略できる
マウスのホットキーには効果がない(マウスのホットキーは常にマウスのフックを使用するから)
チルド(〜)やワイルドカード(*)、キーアップホットキー、およびカスタム組み合わせを含むキーボードホットキーなど、キーボードフックを必要とするホットキーには効果がない
#InputLevelとSendLevelは、送信コマンドによってどのホットキーとホットストリングが実行されるかをさらに制御するらしい

その他便利事項的な

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キーの送信は全部の方法試してないけど正常に機能しないみたい

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

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