今回は、指定したレジストリキー下にある値のデータの変更を監視し、変更があった場合にリストビューに変更内容を表示するというサンプルコードを紹介します。
常に監視しておきたいレジストリキーがある場合などに便利ですので、参考にしてみてください。
主に使用するユーザー定義関数(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 で指定したレジストリキー下にある値のデータの変更を監視し、変更があった場合にリストビューに表示するというサンプルを作成しました。この動画は動作確認のためにアップしました。サンプルコードは以下のページで紹介しています。
拡張子の表示、非表示などを行うたびに変更が検知され、変更されたレジストリの情報を表示します。
コメント