サンプルコード

Autoit|指定したレジストリキー下にある値のデータの変更を監視

今回は、指定したレジストリキー下にある値のデータの変更を監視し、変更があった場合にリストビューに変更内容を表示するというサンプルコードを紹介します。

常に監視しておきたいレジストリキーがある場合などに便利ですので、参考にしてみてください。

主に使用するユーザー定義関数(UDF)は次の 7つです。

関数名説明
_WinAPI_RegOpenKey指定されたレジストリ キーを開きます
_WinAPI_GetErrorMessage指定されたシステム エラー コードのテキスト エラー メッセージを取得します
_WinAPI_CreateEvent名前付きまたは名前なしのイベント オブジェクトを作成または開きます
_WinAPI_RegNotifyChangeKeyValue指定されたレジストリ キーの属性または内容の変更について呼び出し元に通知します
_WinAPI_WaitForSingleObject指定されたオブジェクトがシグナル状態になるまで待機します
_WinAPI_CloseHandle開いているオブジェクト ハンドルを閉じます
_WinAPI_RegCloseKey指定されたレジストリ キーへのハンドルを閉じます

サンプルコード

このサンプルコードでは、次のキー下にある値のデータの変更を監視します。

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced

このキーは拡張子の表示または非表示、隠しファイルの表示または非表示などの情報が保存されているキーになります。

#include <WinAPIReg.au3>
#include <APIRegConstants.au3>
#include <WinAPIDiag.au3>
#include <Array.au3>
#include-once

Opt('TrayAutoPause', 0)

$Key = "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
$IniFile = @ScriptDir & "\RegCheck.ini"

Check1(); まず初めに iniファイルに現在の状態を書き込んでおきます。

; "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" キーを指定します。
$hKey = _WinAPI_RegOpenKey($HKEY_CURRENT_USER, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced', $KEY_NOTIFY)
If @error Then
    MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), @extended, _WinAPI_GetErrorMessage(@extended))
    Exit
EndIf

Local $hEvent = _WinAPI_CreateEvent()
If Not _WinAPI_RegNotifyChangeKeyValue($hKey, $REG_NOTIFY_CHANGE_LAST_SET, 0, 1, $hEvent) Then
    Exit
EndIf

While 1
    If Not _WinAPI_WaitForSingleObject($hEvent, 0) Then; もしも指定したキー下にある値のデータに変更があれば
        Check2(); iniファイルに書き込んだデータと現在のデータを比較して変更があればリストビューに表示します。
        Check1(); iniファイルに現在の状態を書き込みます。
        If Not _WinAPI_RegNotifyChangeKeyValue($hKey, $REG_NOTIFY_CHANGE_LAST_SET, 0, 1, $hEvent) Then
            ExitLoop
        EndIf
    EndIf
    Sleep(100)
WEnd

_WinAPI_CloseHandle($hEvent)
_WinAPI_RegCloseKey($hKey)

Func Check1()
    For $i = 1 To 100
        $Val = RegEnumVal($Key, $i)
        If @error Then ExitLoop
        IniWrite($IniFile, "RegKVal", $i, RegRead($Key, $Val)); 指定したキー下にある値の名前を取得して iniファイルに書き込みます。
    Next
EndFunc   ;==>Check1

Func Check2()
    Local $ValName[1][4], $KeyType

    For $i = 1 To 100
        $Val = RegEnumVal($Key, $i)
        If @error Then ExitLoop
        $Read = IniRead($IniFile, "RegKVal", $i, ""); iniファイルのデータを読み込む
        $ReadVal = RegRead($Key, $Val); 現在のデータを読み込む
        If @error Then ExitLoop

        If $Read <> $ReadVal Then; データを比較して変更があれば

            Switch @extended; 値の種類
                Case 1
                    $KeyType = "REG_SZ"
                Case 2
                    $KeyType = "REG_EXPAND_SZ"
                Case 3
                    $KeyType = "REG_BINARY"
                Case 4
                    $KeyType = "REG_DWORD"
                Case 7
                    $KeyType = "REG_MULTI_SZ"
                Case 11
                    $KeyType = "REG_QWORD"
            EndSwitch

            $ValName[0][0] = $Key
            $ValName[0][1] = $Val
            $ValName[0][2] = $KeyType
            $ValName[0][3] = "「" & $Read & "」から「" & $ReadVal & "」に変更されました。"

            ; リストビューに表示します。
            _ArrayDisplay($ValName, $Key, 2, $ARRAYDISPLAY_NOROW + $ARRAYDISPLAY_COLALIGNCENTER, Default, "キー名|値の名前|値の種類|値のデータ")
            ExitLoop
        EndIf
    Next
EndFunc   ;==>Check2

実際の動作をご覧ください。

Autoit 指定したレジストリキー下にある値のデータの変更を監視
Autoit で指定したレジストリキー下にある値のデータの変更を監視し、変更があった場合にリストビューに表示するというサンプルを作成しました。この動画は動作確認のためにアップしました。サンプルコードは以下のページで紹介しています。

拡張子の表示、非表示などを行うたびに変更が検知され、変更されたレジストリの情報を表示します。

コメント