右 Windows キーがないキーボードでアプリケーションキーを右 Windows キーの代用にする・ただし単体で押した時はアプリケーションキーとして使う

経緯

ぼくは過去の記事で何回か、Windows で使う日本語キーボードは右 Windows キーがある109配列が好きだと発言してきた。

現在自宅で使っているのは、上の記事に書いたサンワサプライの109キーボードなのだが、会社にはそれまで使っていた Logicool の108配列キーボードを持っていって使っている。

この Logicool MK275 は、右 Windows キーがない日本語108キーボードで、とにかくつらい。Win + RWin + E を押す時の Windows キーは右 Windows キーを使っているので、それができないと途端に「ああもうダメだ仕事になんねぇ帰ろ…」となってしまう。

そこで、同じくキーボード右側に配置されているアプリケーションキーを、右 Windows キーの代用にできないかを調べてみた。

キーリマップができるフリーソフトを色々探したのだが、どうもアプリケーションキー単体をいじくる機能がないか、いじれても元のアプリケーションキーとしての機能は失うモノしかなかった。いや、そうじゃないんだ、他のキーと合わせて押した時は Windows キーの代わりをしてほしいが、単体で押した時は普通のアプリケーションキーとして動作してほしいのだ

これはぼくが Excel で「アプリケーションキー → E」と押すことで「コピーしたセルの挿入」を多用しているから、というたったそれだけの理由なのだが、こんなワガママは通らないものか…と色々考えていた。

そこでふと、以前 Atom エディタのショートカットを作る時に導入した、AutoHotKey というフリーソフトのことを思い出した。

AutoHotKey の本来の使い方は、独自のショートカットキーを作るモノだ。このソフトなら、自分でスクリプトを書いて狙ったことができるかもしれない…。

というワケで作った

というワケで、以下が自分で作った AutoHotKey スクリプト

; 「アプリケーションキー + 他のキー」を押下すると「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} と書いた。これは、

というキー入力を順に書いており、これによって Win + R というショートカットを実行している。

あとはこれを、Windows キーを使った主要なショートカットの分だけ羅列して、上のようなコードになった。

アプリケーションキーと共に押下したキーをそのまま送る、みたいなことができれば、つまり「AppsKey & 【何か】::Send, LWin & 【何か】」みたいな書き方ができれば、本当に1行で済むのだが、うまく探せなかった。何か入力するキーを保持するスクリプトとかあったっぽいけど、うまく適用できそうになくて諦めちゃった。

Win + L とか入ってないけど、この時は左 Windows キーしか使わないから書いていない。組み合わせで打つショートカットキーは両手で打つのがぼくの打ち方なのだ。だから本当は Win + EWin + RWin + D ぐらいだけでもとりあえず良かった。w

さて、最後にある

AppsKey::AppsKey

この1行だが、これは先程の AppsKey & r:: といったコンビネーションキーの宣言をしてしまうと、1つ目のキーを単体で押下した時の元々の動作がキャンセルされてしまう、という AutoHotKey の仕様があり、これを回避するために書いた。

単一キーを押下した時に、というトリガー部分は AppsKey:: で先程と同様。そのあと何のキーを押したことにするか、という部分は、単一キーにリマップする場合は直接 AppsKey などと書ける。

すなわち、アプリケーションキーを一切使う気がなければ、AppsKey::LWin とでもしてやれば、アプリケーションキーを左 Windows キーに見せかけて使えるようになるはずだ。

単一キーの元々の動作を有効にするためのスクリプトの書き方が、こういうイディオムで良いのか分からないが、こう書けばとりあえずアプリケーションキーを単体で押下した時はアプリケーションキーとして動作するようになった。


以上。今更知ったけど AutoHotKey ってけっこう可能性ありそう。

AutoHotKey スクリプトを書く際に参考にしたサイト