/ 最近 .rdf 追記 編集 設定 本棚

脳log[20071122] しょーもない。けど切実。Ctrl+Wの Ctrlが残る問題。(もう SetPointのアップデートは待たない)



2007年11月22日 (木)

最終更新: 2010-01-12T06:09+0900

[MX610] しょーもない。けど切実。Ctrl+Wの Ctrlが残る問題。(もう SetPointのアップデートは待たない)

Vistaに対応した最初の SetPoint version 4.00がリリースされてから一度もアップデートがないのだけど。

MX610に同梱されてた SetPointから続く、Firefoxに Ctrl+Wを投げてウィンドウを閉じると時々 Ctrlキーが押し下げ状態のままになってしまって、Ctrlキーを一度押し直して解除してやる必要に迫られる問題は残されたまま。

Ctrlの状態が見えないものだから、スクロールしようとホイールを回して文字サイズが大きくなってはじめて気付くことになる。それにびくついてしまって Ctrl+Wを割り当てた中ボタンを使わずに右上の×印までポインタを持って行って閉じてみたり、中ボタンで閉じてから心配になって Ctrlキーをたたいてみたりして、いまいち手間を省けてなかった。

気づいたんだけどウィンドウを閉じてしまうようなキーストロークって使ってるのは Ctrl+Wだけで、その Ctrl+Wを送ってるのもエクスプローラと Firefoxと「その他すべてのプログラム」の 3つだけだった。

SendInputっていう APIを試してみたけど Ctrlが残るようなことは起こらなかった。で、ひとつの解決法。

 1 ソースファイル(^W.cpp)を用意して

#include <windows.h>
#define numof(array) (sizeof(array)/sizeof(array[0]))

int main()
{
	INPUT inputs[] = { {INPUT_KEYBOARD}, {INPUT_KEYBOARD}, {INPUT_KEYBOARD}, {INPUT_KEYBOARD} };
	inputs[0].ki.wVk = VK_CONTROL; inputs[0].ki.wScan = 0; inputs[0].ki.dwFlags = 0;               inputs[0].ki.time = 0; inputs[0].ki.dwExtraInfo = NULL;
	inputs[1].ki.wVk = 'W';        inputs[1].ki.wScan = 0; inputs[1].ki.dwFlags = 0;               inputs[1].ki.time = 0; inputs[1].ki.dwExtraInfo = NULL;
	inputs[2].ki.wVk = 'W';        inputs[2].ki.wScan = 0; inputs[2].ki.dwFlags = KEYEVENTF_KEYUP; inputs[2].ki.time = 0; inputs[2].ki.dwExtraInfo = NULL;
	inputs[3].ki.wVk = VK_CONTROL; inputs[3].ki.wScan = 0; inputs[3].ki.dwFlags = KEYEVENTF_KEYUP; inputs[3].ki.time = 0; inputs[3].ki.dwExtraInfo = NULL;
	SendInput(numof(inputs), inputs, sizeof INPUT);
	return 0;
}

 2 コンパイル&リンク

>cmd /V:ON
>"C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin\SetEnv.Cmd" /Vista /Release
>cl "^W.cpp" /link /SUBSYSTEM:WINDOWS /nodefaultlib /entry:main user32.lib

 3 キーストロークの割当(Ctrl+W)の代わりにプログラムの起動(^W.exe (2KB))を中ボタンに割り当てる

うへっ、しょーもねー。(でも必要十分にして手放せない)

 追記

エクスプローラや Firefoxや SakuraEditorなどは OKなんだけど、気付いたところでは Hamanaだけが Ctrl+Wではなく Wというキーストロークが送られたとしか受け取ってくれない。ゲームとかハードウェアに近いレイヤーで入力を受け取ってそうなものが結構ダメかもしれない。わからんけど。そうだとしたら SetPointとしては無視できないよね。ゲームにキーストロークが送れないとか。(自分にとってはそのせいで抱え込む誤動作の方が無視できないわけだけど)

 追記@2008-03-14: 2000年頃*と違う、最近の高速な PCなら

WSHで WScript.Shell.SendKeysを使えば、メモ帳だけで解決できる。たぶん起動時間は気にならない程度になっているだろう。

 追記@2008-06-19: SendKeys版を具体的に書くと

これだけ。

new ActiveXObject("WScript.Shell").SendKeys("^w");

これを ^W.jsとでも保存して SetPointでボタンに割り当てるだけ。拡張子が exeでないファイルはデフォルトでは表示されないが問題なく割り当てられるし実行もできる(少なくとも Vistaでは確認した)。これだけ簡単だと "^w" の部分をハードコードせずに、引数として任意のキーストロークを表す文字列を受け取りたくなるが、SetPointが引数付きでプログラムを起動してくれないのでできなかった。(ちなみに Alt+F4なら "%{F4}" になる)

気になる起動時間は、exeと遜色ないくらい一瞬だった。ちなみにマシンスペックは

Windows エクスペリエンス インデックス サブスコア
プロセッサAthlon64 X2 3800+4.8
メモリ(RAM)DDR 2GiB5.5

1、2年前に既にこなれた値段で売られていたようなもの。

* JScript@WSHと C#@.NET1.0の起動に 20-30秒くらいかかっていた、メモリ 64MBのあの頃

本日のツッコミ(全1件)
ds14050 2008年12月18日 (木) 18:14 JST

http://www.mstarmetro.net/users/rlowens/?n=SetPoint.StuckModifiers に、これ以外の解決法が詳細にのっている。(1.AutoHotkeyを使用。2.uberOptionsを使用。3.user.xmlを直接編集)