last update: 2013/09/03

2003/12/19

かなしいときー

だから忙しいんだってば、とか言いながらも更新。

つい最近までtasktrapでダブルクリックとシングルクリックの判別をやってメニューを切り替えてたわけですが(メニュー統合で廃止されました)、ダブルクリックと判断される間隔はユーザ設定によるものなので、アプリケーション実行時にレジストリから取得しなければなりません。

DWORD TaskTrapMainWnd::GetMouseDblclkSpeed(){
   HKEY hKey;
   tchar dblclk[10];
   DWORD size;
   RegCreateKeyEx(HKEY_CURRENT_USER, t("Control Panel\\Mouse"), NULL, NULL,
      REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
   RegQueryValueEx(hKey, t("DoubleClickSpeed"), NULL, NULL, (LPBYTE)dblclk, &size);
   RegCloseKey(hKey);
   _stscanf(dblclk, t("%d"), &dDblclkSpeed);

   return dDblclkSpeed;
}

まぁ、ごちゃごちゃしてますけど、要はレジストリのユーザキーの所からControl Panel\MouseをさがしてそこのDoubleClickSpeedの値を取得してるわけです。戻り値はミリ秒単位のDWORDです(ホントはDWORDですなんてサイズはいらないんだが)。

でだ。

ふと「あれー、RegisterClassExとかで登録したウィンドウのクラス名をウィンドウハンドルから取得するのは何だったかなー」とヘッダファイルを探してたわけですが(注: MSDNのヘルプは間違ってインデックスファイルを消してしまって放置中なので検索できないワナ発生中…って、年内にはなんとかしなきゃ)、winuser.hでGetClassNameを発見して「ああ、これだ」とか思って近辺にある関数定義を眺めてたんです(ヘッダを直接探す習慣が付くとプログラミングのスキル向上は早い…とかだれかが言ってた気がしますが、あれは当たってると思う)。

すると、こんな関数定義が。

WINUSERAPI
UINT
WINAPI
GetDoubleClickTime(
    VOID);

えっ…。念のためAPIヘルプを引いてみると、上の自分でごちゃごちゃ書いた関数がそのまんまWin32APIで用意されてるのな。自分の回り道っぷりに「ぬぉー」とか叫びたくなりましたが、まぁ、レジストリを扱う関数を書いたのはアレが初めてだし、よしとすることにしよう…。

何が言いたかったかというと、あらかじめ用意されている関数でもそれを自分でインプリメントすることで得られる知識というのはバカにならんのですよ、とかいう話。ほら、C言語おぼえたての頃「strlen関数を自分で作ってみる」とかいうような課題に当たったり、そういうことを自分でやってみたりしたでしょ。結局、Windowsプログラミングだろうが何だろうがそういうことの延長なんだなぁ、と。

comments powered by Disqus