[AHK] Ctrl/Alt/Shift/Winの組み合わせを別のキー1つで代用させる方法

2016年03月24日

Windows上で使うホットキーやショートカットキーをAHK(AutoHotkey)でカスタマイズするときに、「Ctrl+Shiftを別のキー1つで代用する」という機能を実現しようとしたら、意外と手こずってしまいました。事の次第と解決法をメモしておきます。

したかったこと

Ctrl/Shift/Alt/Winキーを組み合わせて同時に押す操作を、別のキー1つで代用させたいと考えました。

たとえば、「Ctrl+Shift+○」というキー操作を、「CapsLock+○」だけでできるようにする、といったことです。「○」に何が来た場合でも機能するよう、「Ctrl+Shift=CapsLock」という意味になる単独のキー定義として記述したいと考えました。

予備知識

AHKでは、特定のキーを別の役割に変えたい場合、通常は、

変更前のキー::変更後のキー

という1行を記述するだけで実現できます。キーの「リマップ」という機能です。

たとえば、CapsLockキーをCtrlキーとして使いたいのであれば、

CapsLock::Ctrl

という1行で済みます。

あるいは、CapsLockキーを Ctrl+F の役割で使いたければ、

CapsLock::^f

という1行です。

つまずいた点

ところが、CapsLockを Ctrl+Shift に置き換えたいときに、上と同じ要領で、

CapsLock::^Shift

と書いても、正しく動きません。CapsLock::+Ctrl とか CapsLock::+^ でもダメです。

それならば、リマップではなく、キーストロークを明示的に送ってやればよいかと思い、

CapsLock::Send, ^{Shift}

のように変えてみたのですが、やはり動きません。

どうすればよいかわからず、小一時間ほど悩んでしまいました。

解決法

どうやら、Ctrl/Shift/Alt/Winの組み合わせだけを単独で定義したい場合は、「キーを押したとき」「キーを離したとき」の2行に分けて記述すればよいことがわかりました。

たとえば、CapsLockを Ctrl+Shift にするなら、次のような2行を記述すれば、意図したとおりに動きます。

*CapsLock::Send, {Blind}{Ctrl DownTemp}{Shift DownTemp}
*CapsLock Up::Send, {Blind}{Ctrl Up}{Shift Up}

一見複雑ですが、

  • CapsLockを押した時点で、CtrlとShiftを押しっぱなしにしたとみなす
  • CapsLockを離した時点で、CtrlとShiftを離したとみなす

という内容の定義になっています。

※行頭の * や、途中の {Blind} という記述は、他のキーと組み合わせて押したときにも機能させるための指定らしいです。

変更元のキーをCapsLock以外にしたい場合や、Ctrl/Alt/Shift/Winの組み合わせ方を変えたい場合も、同じような要領で、2行に分けて書けばOKです。

こうして、当初の目的を達成できました。あまり機会はないかもしれませんが、もしこういうキー定義をお使いになることがありましたら、お試しください。

余談

ちなみに、なぜこのようなキー定義をしたかったかというと、私が使っているエルゴノミクスキーボード「Kinesis Advantage」で、親指で押すキー(下図赤丸部分)に、Ctrl+Shift や Ctrl+Alt を割り当ててみようと思ったからです。

160324_kinesis.jpg

これまでは、このあたりのキーを組み合わせて押すときに、ピアノの「指くぐり」みたいな、複雑な手の形で入力していたのですが、よく使う組み合わせは親指一本で押せれば楽なのでは?と考えた次第です。

実際に試してみたら、長年慣れ親しんだ手の形と違うせいで、頭と指が混乱していますが…。

posted by 内山卓則 at 17:37 | スクリプト・プログラム