実行ファイルでキーボードエミュレートすりゃいいんじゃん

前に「今求めるユーザーインターフェイス」という回でちょっと書いたのですが、僕はキーボードの左手位置に、「タブを切り替えるホットキー」と「ウインドウを切り替えるホットキー」が欲しいといつも感じてるんです。要はCtrl+Tabなどを押せばいいだけなんですが、ワンキーでこれをエミュレートできればストレスが大幅軽減されるかと。

私は自宅では「マイクロソフト ワイヤレス オプティカル デスクトップ for Bluetooth
http://www.microsoft.com/japan/hardware/keyboard/op_desk_elite_bt.mspx
なんていうキーボードとマウスのセットを使っています。このキーボードにはけっこうホットキーが多彩で使いやすいんですが、なんと任意のキーストロークを割り当てることができない。使えるようであんまり使えないホットキーなんです(切り取り、とか貼り付け、とかはできたような)。

そこで、この操作性を改善する案を考えてみました。


・キーボードの左隣にゲームパッドを設置し、JoyToKeyをかませてキーエミュレーションする

JoyToKeyというソフトを使用すれば、ゲームパッドの入力をキーストロークに変換することができます。ちょうどパソコンショップで小さなゲームコントローラ(http://www.sanwa.co.jp/product/syohin.asp?code=JY-PMUB)を発見したので、組み合わせてみました。

使ってみると、たしかに便利で快適。…なんですが、どうもしっくりこない。というかダサい。せっかくキーボードがワイヤレスなのにゲームパッドはワイヤードでもったいないし。その機能のためだけにタスクトレイにソフトがいっこ常駐してるのもあまりよいものではありません。(なお誤解のないように書いておきますが、JoyToKeyはとてもすばらしいソフトです。このソフトがダサいと言ってるわけではありませんので。)


そこでさらに考えました。「このキーボードのホットキーでファイルを起動することだけできるんなら、キーエミュレーションだけする実行形式のファイルを作ればいいんじゃね?」

ということで作ってみました。まずは僕の大好きなwindows scripting host (JScript)を使って、

//-------------------------------------

var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.SendKeys("^{TAB}");

//-------------------------------------


こんなスクリプトファイルを作ってホットキーに割り当てます。で、実行。

をを、うまくいった!見事にタブが切り替わりました。でも……

………遅い!

実際に計ってみたわけではありませんが、実行終了まで0.5秒ぐらいかかってる気がします。まあたしかにスクリプトファイルはNAS上に置いてますので、その転送の時間がかかってるのかもしれません(でも2回目以降はキャッシュされると思うんですが、やっぱ遅い)。またJScriptインタプリタではないので、実行の度にコンパイルするってのも反応を悪くしている原因ではあるでしょう(インタプリタなら早いってわけでもないですが)。それにしても遅すぎる。

で、もっと反応を早くしたかったのでCで作ってexeファイルをビルドしてみることにしました。こんな感じでいいのかな?。


//-------------------------------------

#include

DWORD WaitTime = 10;

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)
{
keybd_event(VK_CONTROL, 0x00, 0, 0);
Sleep(WaitTime);
keybd_event(VK_TAB, 0x00, 0, 0);
Sleep(WaitTime);
keybd_event(VK_TAB, 0x00, KEYEVENTF_KEYUP, 0);
Sleep(WaitTime);
keybd_event(VK_CONTROL, 0x00, KEYEVENTF_KEYUP, 0);
return 0;
}
//-------------------------------------



キーストロークコマンドライン引数で渡そうかとも考えたんですが、エラー処理等を考えるとめんどくさいので全部決め打ちにしました。

で、BCCコンパイルしてリンク。ぽこっと出来たexeファイルをホットキーに割り当てて…をを、動いた。

…でも遅いじゃん。速度ほとんど変わってないじゃん。今回はちゃんとローカルディスクに保存してあるのに。これはウエイト云々の話じゃないな。

やっぱりホットキーを押してからプロセスを生成するところにオーバーヘッドがあるようです。ここをつめるのはあまりにも現実的ではないので、しょうがなくこれでガマンすることにしました。


ちなみに、僕の使ってるキーボードの左手部には、チルトホイールのほかに機能割り当てが可能なホットキーが7個あります。残念ながらチルトホイールには標準機能意外を割り当てることはできません。それぞれのキーは次のように設定してみました。

←:前のウィンドウ(ドライバの内包機能)
→:次のウィンドウ(ドライバの内包機能)
1:Shift+Ctrl+Tab
2:Ctrl+Tab
3:Alt+Tab
4:Alt+Space N
5:Ctrl+W

なかなかヨイ。