AutoHotKey + USB3入力フットスイッチ で運用してみた

3ボタンフットスイッチを購入してしばらくの間、何のアプリでも使えそうな操作…ということでCtrl+z / Ctrl+Shift+z などを割り当てていましたが、全く出番がないことがわかりました。キーボードに手を置いていればもちろんのこと、右手マウスの時でも左手だけで押せるので、Ctrl+zが押しづらくて不便を感じたことなんてそもそも無かったのです。
このままでは勿体無いので、AutoHotKeyを導入して、アプリ毎に個別の動作を設定することにしました。

AutoHotKeyについて

AutoHotkey
キー操作に対して、特別な動作を定義できるソフトです。単純なキー配置変換ではなく、複雑な条件や動作をプログラムできます。単純な例では「Firefox上でF1を押したらCtrl+Tabになる」など。ジョイスティックの入力や、マルチメディア系の変なキー入力、マウス操作、マウス座標なども拾えます。


流行らせるページ跡地
日本語の解説は上記のページが一番まとまっているようですが、更新は止まっています。付属のヘルプの内容を訳しただけに近いので、英語に抵抗がなければ最新のヘルプを直接読みましょう。
解説ページは少なくともユーザーはそれなりにいるようで、何か困ったときにはぐぐると、blogや2chの日本語での情報がそれなりに引っかかります。


AutoHotKeyの出来ることは非常にたくさんありますが、まずは「USBフットスイッチに割り当てたキー操作に対して、アクティブなウィンドウごとに違う動作を設定する」が当面のゴールです。
フットスイッチに設定するキーはなんでもいいですが、CtrlやShift等の制御キーとの同時押しとなるように設定すると勿体ないのでやめましょう。生のキーストロークがフットスイッチから出てくるようにしておけば、制御キーとの同時押しによって、AutoHotKeyで全く別の動作をさせることができます。


うちではとりあえず、深く考えずにF9/F11/F12を割り当ててみました。以下の説明では、この3ボタンがフットスイッチを表すと思ってください。

フットスイッチに動作を割り当てる(基本)

  F9::Send ^z
  F12::
    Send ^s
    Run explorer.exe d:
    return

検知対象キーのあとにコロンを2つつけて、その後に動作を記載します。
修飾キーの指定は+がshift、^がCtrl、#がWindowsキーを表し、右辺左辺どちらにも使用可能です。また組み合わせも可能で、+^と書けばCtrl+Shiftを表します。
動作は、単一の動作やキー置き換えのみの場合は、すぐ右側に書いて終わりにしてOKです。複数の文を書く場合は、最後にreturnをつける必要があります。

単純なキー置き換えとSendの違い
  F9::^z
  F11::Send ^z

単純に「あるキーが押されたらCtrl+zを出力したい」場合、右辺に直接キーを書く方法(remap)と、Sendコマンドを使う方法があります。remapでは、F9の例のように右側にも対象キーを書けばOKです。最初は違いが理解できませんでしたが、修飾キーとの同時押しをした際の挙動が異なるようです。

上記の例では、どちらも単体で押すとCtrl+zが送信されます。Shiftと同時押しすると、F9の例はキーストロークの変換に相当するためShift+Ctrl+zが入力されますが、F11は何も起きません。
つまりShift同時押しでShift+Ctrl+zにしたいときは、直接記述するほうが見た目がすっきりしてcoolだぜ!…なんてことはありません。remapをしてしまうと、修飾キー同時押しによる別動作の記述が全く出来ません。

  F9::^z
  #F9::^x
  F11::Send ^z
  #F11::Send ^x

こんな記載をしても、F9のほうはWindowsキーとの同時押しでCtrl+xとはなってくれず、Windowsキー+Ctrl+zになります。単純なキー置き換えは、キーの機能を完全に変えたい場合に用いるもので、フットスイッチで動作を割り当てるようなケースで使ってはいけません。

Sendでは、特殊キーを記述する場合には Send {F11} のように中カッコ{ }で括る必要があります。何も考えずにSend F11なんて書くと、F→1→1と3ストロークになります。(別の見方をすると、そういう連続入力を表現可能ということ)

アクティブなウィンドウによって動作を切り替える

#IfWinActive, .+Firefox$
{
  F11::^Tab
}
#IfWinActive, .+Thunderbird$
{
  ... 以下省略

#IfWinActiveは、検知対象のウィンドウ指定です。ウィンドウタイトルか、ウィンドウハンドルを指定します。別のアプリの動作は、ブロックを閉じたあとにまた#IfWinActiveから書いて並べればOK。
ウィンドウ指定なので、設定ダイアログ等を出すと変化するのが注意点です。ダイアログがアクティブになっているようなときに、同じショートカットキーを使いたいことはあまりなさそうなので、実用上あまり問題ではないかもしれませんが。

ウィンドウ指定方法

指定すべきウィンドウの情報は、AutoHotKey付属のAU3_Spy.exeを使うと確認可能です。タスクトレイのAutoHotKeyアイコンを右クリック→「Window Spy」を選択でも起動できます。例えば、今記事を書いているFirefoxのウィンドウを見ると、次のような表示が確認できます。

>>>>>>>>>>( Window Title & Class )<<<<<<<<<<<
記事を書く - ctrl-alt-moccos - Mozilla Firefox
ahk_class MozillaUIWindowClass

1行目はウィンドウタイトル、2行目がウィンドウクラスです。
IfWinActiveの最初の例では、ウィンドウタイトルを使って検知する記述をしていました。ウィンドウクラスで指定したいときは…

#IfWinActive ahk_class MozillaUIWindowClass

ahk_classと最初に書いて使います。しかし残念なことに、ウィンドウクラスも他のアプリケーションと被ることがあります。Firefoxは、実はThunderbirdと同じです。

>>>>>>>>>>( Window Title & Class )<<<<<<<<<<<
Gmail - Mozilla Thunderbird
ahk_class MozillaUIWindowClass

このようなケースでは、ahk_classによる判断は使えませんね。
逆にウィンドウタイトルから判断しづらいものもあり、その典型的な例はExplorerです。

>>>>>>>>>>( Window Title & Class )<<<<<<<<<<<
ローカル ディスク (D:)
ahk_class CabinetWClass
検出条件マッチング方法の設定

検出条件に正規表現を使うには、SetTitleMatchModeの設定を変えておく必要があります。

SetTitleMatchMode RegEx

試していませんが、デフォルトは前方一致で、他には後方一致・中間一致があるようです。
正規表現対応にすると多少動作負荷がありそうですが、誤検知が出るほうが嫌なので使うことにしています。いまどきのCPUで気になるような負荷でもないかなと。

複数ボタン同時踏みを検知できるようにする

フットスイッチの各ボタンにキーを割り当てて同時押しを定義するだけでも、Shift/Ctrl/Winとの組み合わせで、かなりの数の機能を割り当てることが出来ます。しかし、両手が埋まっている状態では依然としてボタン数と同数までしか使えていません。足操作に割り当てる機能を増やすならば、同時押しに対してパターンを割り当てることが出来ます。

  F9 & F11::Send ^a
  F11 & F9::Send ^b

どちらかを先に押して、その後もう片方を押すと検知されるため、同じ組み合わせでも2パターンになります。左辺にShift等の修飾キー表現を使ったり、3つ以上の組み合わせを定義することは出来ません。(今回は足のみで操作することを考えているので、どうでもいいですが)


注意点は、最初に踏むほうのキー単独押下に対して機能が割り当てられなくなることです。上記の例では、F9単独押しの機能・F11単独押しの機能を書いても動きません。ですが、実はキーを離したときの定義は可能です。一部の機能だけ「離したとき起動」になるのは気持ち悪いですが、割り当てられる数を増やしたいならば我慢です。

  F9 & F11::Send ^a
  F9 up::Send ^c
  +^F9::Send ^d


3行目のような修飾キーつきの定義は、問題なく押下時に起動します。

マウス動作とのコンビネーションを検知できるようにする

マウス操作との組み合わせも可能です。(ジョイスティックとの同時押しは、どうも同じ方法では動かんな…)

  ~LButton & F11::Send a
  F11 & LButton::Send b

マウスでは主に LButton / RButton / MButton / WheelDown / WheelUpなどが使えますが、Wheel系を「先に押すキー」として使用することは出来ないようです。
最初に~が付いているのは、ボタンの元々の機能を殺さないという意味です。左クリックの押下が働かなくなってしまってはマウスが使えないので、左クリックはそのままシステムに透過するようにします。先ほどの複数同時踏みF9 & F11のような使い方をするときに~を付けると、まず最初のF9を押したときにF9に割り当てた機能が発動してしまうのでダメです。

AutoHotKey+フットスイッチの利点

キーボードショートカットに不便を感じる場面は、マウス操作中に行いたい動作が多いでしょう。その欲求を満たす別の手段としてマウスジェスチャがありますが、マウスポインタを一切動かさずに操作が出来ることは、単純なマウスジェスチャと比較して優れている点です。
もちろん、コントローラによるゲーム中や、MIDIキーボード入力時には両手が基本的に埋まっているため、フットスイッチは大活躍です。

足による入力デバイスの選択

うちで使用しているのは、この手の製品が安い価格で出回り始めるきっかけとなったScytheの製品です。カチカチと非常にうるさいので、今なら他のものを選んだほうがいいような気がします。どの製品を使うにしろ、全てのアプリで3種類のキーだけで使うなんて実用に耐えないので、AutoHotKeyの類を併用するのは必須といえます。