マウス設定なら SystemParametersInfo

PC を再起動するとマウスの設定がデフォルトに戻されてしまうので、レジストリの項目 HKEY_CURRENT_USER\Control Panel\Mouse へのアクセス拒否を実施してから長らく経つ。この設定には何の不便さもないが、Windows API でマウスの設定を変える方法がわかったので、その方法を試してみることにした。

スタートアッププログラムとして、以下の C ソースコードより生成されたアプリケーションを実行する。

#include <windows.h>
int WINAPI WinMain(HINSTANCE hi, HINSTANCE hp, LPSTR cl, int cs) {
  SystemParametersInfo(SPI_SETDOUBLECLICKTIME, 200, NULL,
    SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
  return 0;
}

レジストリの項目 HKEY_CURRENT_USER\Control Panel\Mouse を編集しても、すぐさま反映されるわけではない。そのため、レジストリ系の API ではなく、SystemParametersInfo という専用の API を使う。上記コードでは、ダブルクリック速度を 200 に設定している。第四引数が重要である。SPIF_UPDATEINIFILE は、レジストリに値を書き込むという意味がある。そして、SPIF_SENDCHANGE には、システムに設定変更を通知するという意味がある。これがあるからこそ、設定値の即時反映が行われる。

あとがき

そういえば、Acer V5 171 のタッチパッドだが、キーボードの Fn + F7 を実行すると、一時的に無効にすることができるが、無効にしたまま PC を再起動すると、無効になりつづけている。マウスカーソルも表示されなくなるので、もし、仮に、Fn + F7 を知らなければ、故障と思うのも無理はない。無自覚に Fn + F7 を押してしまい、再起動してもタッチパッドが反応しないという、そんな事態に。

ちなみに、WSH で同じことをやろうとすると、以下のようなコードになるが、マウスのプロパティ画面を開いて閉じるという、エレガントでない処理が必須になる。

var sh = WScript.CreateObject("WScript.Shell");
sh.RegWrite("HKCU\\Control Panel\\Mouse\\DoubleClickSpeed", "200", "REG_SZ");
sh.exec("rundll32.exe shell32.dll,Control_RunDLL main.cpl").Terminate();