ahk-logo

キーボードユーティリティ系をまとめたい

最近パソコンが重いので余計な常駐ソフトを減らそうと一覧を眺めていると、

○ enthumble
○ HUT

のキーボードマウスユーティリティがありました
前にブログでも紹介してます

いまのところ、 enthumble は 無変換+IJKL で上下左右キーにしています
コレ以外も 1 つ 2 つはあった気がしますがほぼ使ってません
いつの頃からか、無料版はカスタマイズが禁止になっていたので 一応カスタマイズ使える頃の古いバージョンのままです
2012 年ので 2.8 でした

HUT は昔から更新が終わってるようですが、バグが残っています
いまのところ、マウスのサイドボタンのカスタマイズだけになっています


1 つのソフトにしてしまいたいのですけど、 enthumble では単純なマウスのボタンにキー割当はできません
HUT は高機能ですが更新されないしバグがあるのでできれば別のソフトにしたいです


ということで新しいソフトを探していたのですが、これっていうのがなかなか見つかりません

AutoHotKey

この手のソフトを調べると絶対目にするのが AutoHotKey (AHK) というソフトです

すごい高機能でまだ更新も続いています

唯一の欠点が「扱いづらい」ということ

よくある、画面で「このキーをこのキーに割り当てる」という設定をするものじゃなくてプログラムを書いて制御します
プログラムなので画面で選択肢から選んでいくのに比べてできることが多いです
しかし独自のスクリプトですし気軽に使うにはハードルが高いです

実はこのソフトのインストーラ自身が AHK で作られているようで驚きでした
インストーラまで作れるのか、このスクリプト・・・

気軽に使えるものじゃないっと AHK は避けていたのですが、他にこれってソフトないです

調べてみると enthumble も HUT も AHK を内蔵していて、プログラムを書かなくても画面からマウスで選ぶだけで簡単に使えるようにしてるようでした
中で AHK を使ってるなら今の設定は絶対に動くはず!ということで AHK 使ってみました

AHK Script

日本語の Wiki もありますが、全然更新されてないようで古いバージョンがメインに書いているようです

AHK と AHK_L とありますが、今では AHK が 1.0 で AHK_L が 1.1 と呼ばれています
2.0 は開発中のようです

enthumble を置き換える

enthumble の 無変換+IJKL を上下左右キーに置き換えるスクリプトはこうなりました

;; vk1Dsc07B: 無変換
;;; Up
vk1Dsc07B & i::
SetKeyDelay -1
Send {Blind}{Up DownTemp}
Return
vk1Dsc07B & i up::
SetKeyDelay -1
Send {Blind}{Up Up}
Return

;;; Left
vk1Dsc07B & j::
SetKeyDelay -1
Send {Blind}{Left DownTemp}
Return
vk1Dsc07B & j up::
SetKeyDelay -1
Send {Blind}{Left Up}
Return

;;; Right
vk1Dsc07B & l::
SetKeyDelay -1
Send {Blind}{Right DownTemp}
Return
vk1Dsc07B & l up::
SetKeyDelay -1
Send {Blind}{Right Up}
Return

;;; Down
vk1Dsc07B & k::
SetKeyDelay -1
Send {Blind}{Down DownTemp}
Return
vk1Dsc07B & k up::
SetKeyDelay -1
Send {Blind}{Down Up}
Return

;;; 無変換単体
vk1Dsc07B::Send,{vk1Dsc07B}

詳しい意味は私もよくわかってないです
サンプルを見て置き換えてるだけです・・・


分かる範囲で解説

簡単なサンプルは 「a::Send, b」
これで a を押すと b が出ます
「Send,b」がコマンドになっていて a を押した時に 「b を出力」という命令が実行されてるということです
「,」 があったりなかったりしますがコピペのせいです
一部の例外を除いて基本は省略できるそうです

コマンドが 1 つのときは 「::」 のあとにかけばいいのですが、複数のコマンドのときは次の行から初めて最後に Return が必要です

a::send b
send c
return

こうしてみても b しかでませんでした
1 行目にコマンドがあると 1 行命令ってみなされてそれ以降は無視されるみたい


a みたいな単純なキーじゃなくて、「複数のキーを押した時」にしたいなら & を使います
& で 2 つのキーを指定すると 1 つ目を押しながら 2 つ目を押したときの動きを定義できるようです

押したままにすると、押したことにするキーも押したままにするにはこうすればいいそうです

【修飾キー】 & 【押すキー】::
SetKeyDelay -1
Send {Blind}{【押したことにするキー】 DownTemp}
Return
【修飾キー】 & 【押すキー】 up::
SetKeyDelay -1
Send {Blind}{【押したことにするキー】 Up}
Return

Blind や Temp や SetKeyDelay がどうして必要なのかとかはわかってませんがこういう構文で書くといいようです
無変換は日本語でしか使わないからかちょっと特殊な 「vk1Dsc07B」 という名前でした

単純にこれだけだと「修飾キー」を単純に押したときには何も起きません
本来の無変換の役割も実行してもらうには、自分で押したことにする命令を定義しておかないといけないようです

ということでこれが必要です

vk1Dsc07B::Send,{vk1Dsc07B}

AHK の機能ショートカット

コマンドのリストをみていると、 AHK の機能を呼び出すこともできるようです
こんな感じで登録してみました

vk1Dsc07B & Esc::Reload
;vk1Dsc07B & F1::Edit
vk1Dsc07B & F1::Run "C:\Program Files (x86)\sakura\sakura.exe" %A_ScriptName%
vk1Dsc07B & F2::KeyHistory
vk1Dsc07B & F3::ListLines
vk1Dsc07B & F4::ListVars
vk1Dsc07B & F5::ListHotkeys

無変換+Escpae でリロード、無変換+F1 でスクリプトの編集画面を呼び出します
デフォルトの Edit コマンドだとメモ帳で開かれてちょっとつらいのでコメントアウトしてます
代わりに サクラエディタで開くようにしてます

「Run」 のあとにコマンドプロンプトに入れる文字を書くと実行してくれます
「%A_ScriptName%」 がいま実行中のスクリプトのファイル名になります


無変換+F1 でちょっと編集して、無変換+Escape で読み込んで試せるので、新しくショートカット作るのがとっても簡単!

あとは

F2 で履歴、
F3 で最近実行したスクリプトの行、
F4 で変数一覧、
F5 でホットキーの一覧、

を表示するようにしています



Windows10 では Ctrl+Win+←→ で仮想デスクトップを切り替えられます
でもこのショートカットキー押しづらいです

昔 dexpot という仮想デスクトップソフトを使ってた頃は、 enthumble を使って

無変換+左クリック ➡ 左側のデスクトップに移動
無変換+右クリック ➡ 右側のデスクトップに移動

という設定にしていたので同じ操作でできるようにします

vk1Dsc07B & LButton::Send {LWin Down}{Ctrl Down}{Left}{Ctrl Up}{LWin Up}
vk1Dsc07B & RButton::Send {LWin Down}{Ctrl Down}{Right}{Ctrl Up}{LWin Up}

コントロールキーなどがからむ時は、ひとつずつキーを押していって離していけばいいみたい

HUT を置き換える

最後にマウスのサイドボタンを PgUp と PgDn にします

XButton1::
Send {PgDn}
Loop, 10
{
Sleep, 50
If GetKeyState("XButton1","P") == 0
Return
}
While GetKeyState("XButton1","P")
{
Send {PgDn}
Sleep, 80 ; miliseconds
}
Return

XButton2::
Send {PgUp}
Loop, 10
{
Sleep, 50
If GetKeyState("XButton2","P") == 0
Return
}
While GetKeyState("XButton2","P")
{
Send {PgUp}
Sleep, 80 ; miliseconds
}
Return

ちょっと複雑になりました
XButton1 と XButton2 がサイドボタンになります

マウスのボタンはキーボードと違って押しっぱなしにしてもリピート送信されないからか、押しっぱなしにするように書いても 1 度しか押されませんでした
なので、自力でリピートしています

「While GetKeyState("XButton1","P")」 で XButton1 が押されてる間繰り返しになります

上半分は、ディレイのための処理です
キーボード押しっぱなしににしても、すぐにリピートされずに 1 秒弱くらいしてからリピートしますよね
そうしないと 1 回押しただけのつもりでもリピートされて使いづらいです

なので 0.5 秒スリープさせたのですが、キーを離して別のキーを押しても 0.5 秒の間はスリープし続けているようで、次のキー操作ができませんでした
仕方なく 0.05 秒ごとにキーが離されていればそこで終了するようにしています

まとめ

これで無事 1 つのツールにまとめられました!

慣れるまでが大変ですが、基本がわかってくるとコピペしてきたのを修正してやりたいことができるので良いソフトですよね

紹介したスクリプトの全体はここで見れるようにしてます