2007-10-03

レジストリの状態を監視する方法

これまでレジストリの監視をするときはタイマーイベントで一定時間毎に RegQueryValueExしていたのですが、 実はレジストリの内容を監視するためのAPIが用意されていました。  
日本語版のページにも少しだけ紹介されていたので、知らなかったのは自分だけなのかもしれませんが...。  
上記のページによると「状態および通知ブローカーAPI」と言うらしいです。
素直に「状態通知API」くらいにしておいてくれた方が目にとまりやすいと思いませんか?
 
ともかく昨日までの受信信号強度の取得部分を書き直してみました。
 
まず、WM_CREATEあたりでレジストリの監視を開始します。
    HREGNOTIFY    hRegNotify;
    
    RegistryNotifyCallback(
        HKEY_CURRENT_USER                   ,
        _T("Software\\Sharp\\ShPhoneLib")   ,
        _T("RFStrength")                    ,
        RegNotifyCallbackFunc               ,
        0                                   ,
        NULL                                ,
        &hRegNotify
    );
 
今回はレジストリの値がそのまま受信信号強度なので問題ないのですが、 レジストリの特定のビットだけを監視したいときはサンプルにあるように NOTIFICATIONCONDITION構造体を使用します。
 
 
続いてレジストリの値が変化したときに呼び出されるコールバック関数。
レジストリの値は pDataに入っています。
VOID RegNotifyCallbackFunc(
        HREGNOTIFY  hNotify     , 
        DWORD       dwUserData  , 
        const PBYTE pData       , 
        const UINT  cbData      )
{
    DWORD   dwRfStrength;

    dwRfStrength = (*(DWORD *)pData);

    if (dwRfStrength == 0) {
        // 圏外
    } else {
        // 圏内
    }
}
 
 
最後、アプリケーションを終了するときにハンドルを閉じます。
    // 終了時に閉じる
    RegistryCloseNotification(hRegNotify);
 
 
タイマーイベントと比べて負荷が軽減したのかは不明ですが、コードはすっきりとしました。
やはりドキュメントは一通り目を通しておかないといけませんね。
 

1 件のコメント:

匿名 さんのコメント...

I found this site using [url=http://google.com]google.com[/url] And i want to thank you for your work. You have done really very good site. Great work, great site! Thank you!

Sorry for offtopic