右 Windows キーがないキーボードでアプリケーションキーを右 Windows キーの代用にする・ただし単体で押した時はアプリケーションキーとして使う
経緯
ぼくは過去の記事で何回か、Windows で使う日本語キーボードは右 Windows キーがある109配列が好きだと発言してきた。
現在自宅で使っているのは、上の記事に書いたサンワサプライの109キーボードなのだが、会社にはそれまで使っていた Logicool の108配列キーボードを持っていって使っている。
この Logicool MK275 は、右 Windows キーがない日本語108キーボードで、とにかくつらい。Win + R
や Win + E
を押す時の Windows キーは右 Windows キーを使っているので、それができないと途端に「ああもうダメだ仕事になんねぇ帰ろ…」となってしまう。
そこで、同じくキーボード右側に配置されているアプリケーションキーを、右 Windows キーの代用にできないかを調べてみた。
キーリマップができるフリーソフトを色々探したのだが、どうもアプリケーションキー単体をいじくる機能がないか、いじれても元のアプリケーションキーとしての機能は失うモノしかなかった。いや、そうじゃないんだ、他のキーと合わせて押した時は Windows キーの代わりをしてほしいが、単体で押した時は普通のアプリケーションキーとして動作してほしいのだ。
これはぼくが Excel で「アプリケーションキー → E」と押すことで「コピーしたセルの挿入」を多用しているから、というたったそれだけの理由なのだが、こんなワガママは通らないものか…と色々考えていた。
そこでふと、以前 Atom エディタのショートカットを作る時に導入した、AutoHotKey というフリーソフトのことを思い出した。
AutoHotKey の本来の使い方は、独自のショートカットキーを作るモノだ。このソフトなら、自分でスクリプトを書いて狙ったことができるかもしれない…。
というワケで作った
というワケで、以下が自分で作った AutoHotKey スクリプト。
AppsKeyToWinKey.ahk
; 「アプリケーションキー + 他のキー」を押下すると「Windows キー + 他のキー」の入力を再現する
; 右 Windows キーがない環境でも、アプリケーションキーを右 Windows キーのように使えるようになる
AppsKey & b::Send, {LWin down}b{LWin up}
AppsKey & d::Send, {LWin down}d{LWin up}
AppsKey & e::Send, {LWin down}e{LWin up}
AppsKey & m::Send, {LWin down}m{LWin up}
AppsKey & r::Send, {LWin down}r{LWin up}
AppsKey & t::Send, {LWin down}t{LWin up}
AppsKey & x::Send, {LWin down}x{LWin up}
AppsKey & Tab::Send, {LWin down}Tab{LWin up}
AppsKey & Break::Send, {LWin down}Break{LWin up}
; コンビネーションキーを設定するとアプリケーションキー単体での元々のキー入力が効かなくなるので自身をリマップして有効化する
AppsKey::AppsKey
導入するには、AutoHotKey を Windows にインストール後、上のコードをコピペして「AppsKeyToWinKey.ahk
」といった名称でどこかに保存する。
AutoHotKey のダウンロードは以下から。
.ahk
という拡張子が、AutoHotKey のスクリプトであることを示している。このスクリプトファイルをダブルクリックで実行すると、タスクトレイに AutoHotKey のアイコンが常駐し、特定のキー入力があったときに AutoHotKey が反応してくれる、という仕組み。
スクリプトについて
AutoHotKey スクリプトの書き方を調べながら書き始め、最後は力技で解決している感があるので、もっと良いやり方がないか気になっている。
ひとまず今回何をやったのかのほとんどは、以下の1行で説明ができる。
AppsKey & r::Send, {LWin down}r{LWin up}
「複数のキーを同時に押した時に何かする」というトリガーを宣言するには、AppsKey & r::
というように、それぞれのキー名を &
で繋ぎ、コロン2つ ::
で定義する。
次に、トリガーが入力されたら「複数のキーを同時に押す動作をする」と書くときは Send,
というコマンドを使う。このあとに Win & r
みたいに書ければよかったのだがどうも上手く行かず、結局 {LWin down}r{LWin up}
と書いた。これは、
{LWin down}
… 左 Windows キーを押し下げるr
… R キーを押す{LWin up}
… 左 Windows キーを離す
というキー入力を順に書いており、これによって Win + R
というショートカットを実行している。
あとはこれを、Windows キーを使った主要なショートカットの分だけ羅列して、上のようなコードになった。
アプリケーションキーと共に押下したキーをそのまま送る、みたいなことができれば、つまり「AppsKey & 【何か】::Send, LWin & 【何か】
」みたいな書き方ができれば、本当に1行で済むのだが、うまく探せなかった。何か入力するキーを保持するスクリプトとかあったっぽいけど、うまく適用できそうになくて諦めちゃった。
Win + L
とか入ってないけど、この時は左 Windows キーしか使わないから書いていない。組み合わせで打つショートカットキーは両手で打つのがぼくの打ち方なのだ。だから本当は Win + E
と Win + R
、Win + D
ぐらいだけでもとりあえず良かった。w
さて、最後にある
AppsKey::AppsKey
この1行だが、これは先程の AppsKey & r::
といったコンビネーションキーの宣言をしてしまうと、1つ目のキーを単体で押下した時の元々の動作がキャンセルされてしまう、という AutoHotKey の仕様があり、これを回避するために書いた。
単一キーを押下した時に、というトリガー部分は AppsKey::
で先程と同様。そのあと何のキーを押したことにするか、という部分は、単一キーにリマップする場合は直接 AppsKey
などと書ける。
すなわち、アプリケーションキーを一切使う気がなければ、AppsKey::LWin
とでもしてやれば、アプリケーションキーを左 Windows キーに見せかけて使えるようになるはずだ。
単一キーの元々の動作を有効にするためのスクリプトの書き方が、こういうイディオムで良いのか分からないが、こう書けばとりあえずアプリケーションキーを単体で押下した時はアプリケーションキーとして動作するようになった。
以上。今更知ったけど AutoHotKey ってけっこう可能性ありそう。