Delphi自帶的TRegistry類只能實現(xiàn)注冊表的基本操作,如果我們要實時監(jiān)視注冊表的變化或者掃描注冊表特定項下的所有子項,TRegistry類就無能為力了。我啃了半天SDK,終于實現(xiàn)了Delphi對注冊表的監(jiān)視與掃描,不敢獨享,拿來獻給廣大的Delphi愛好者。
監(jiān)視注冊表相關項的改變要用到一個API:RegNotifyChangeKeyValue。
LONG RegNotifyChangeKeyValue(
HKEY hKey, // 要監(jiān)視的一個項的句柄
BOOL bWatchSubtree, // 是否監(jiān)視此項的子鍵
DWORD dwNotifyFilter, // 監(jiān)視哪些變化
HANDLE hEvent, // 接受注冊表變化事件的事件對象句柄
BOOL fAsynchronous// 注冊表變化前報告還是注冊表變化后才報告
);
注意上面的hEvent是接受注冊表變化事件的事件對象句柄,我們要用API:CreateEvent來創(chuàng)建一個系統(tǒng)事件對象。
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES結(jié)構(gòu)
BOOL bManualReset, // 是否自動重置
BOOL bInitialState, // 是否設置初始狀態(tài)
LPCTSTR lpName// 事件對象的名稱
);
新建一個工程,添加一個ListBox,兩個Button。
//先寫個監(jiān)視注冊表的例子
//監(jiān)視HKEY_CURRENT_USER\\Software項下所有子鍵
procedure TForm1.Button1Click(Sender: TObject);
var
hNotify : THandle;
hKeyx : HKEY;
dwRes : DWORD;
begin
hNotify := CreateEvent( nil, //不使用SECURITY_ATTRIBUTES結(jié)構(gòu)
FALSE, //不自動重置
TRUE,//設置初始狀態(tài)
\’RegistryNotify\’ //事件對象的名稱
);
if hNotify = 0 then
begin
Showmessage(\’CreateEvent failed.\’);
exit;
end;
if RegOpenKeyEx( HKEY_CURRENT_USER, //跟鍵
\’Software\’, //子鍵
0, //reserved
KEY_NOTIFY, //監(jiān)視用
hKeyx //保存句柄
) <> ERROR_SUCCESS then
begin
CloseHandle( hNotify );
Showmessage(\’RegOpenKeyEx failed.\’);
exit;
end;
if RegNotifyChangeKeyValue( hKeyx, //監(jiān)視子鍵句柄
TRUE, //監(jiān)視此項的子鍵
REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET,
hNotify, //接受注冊表變化事件的事件對象句柄
TRUE //注冊表變化前報告
) <> ERROR_SUCCESS then
監(jiān)視注冊表相關項的改變要用到一個API:RegNotifyChangeKeyValue。
LONG RegNotifyChangeKeyValue(
HKEY hKey, // 要監(jiān)視的一個項的句柄
BOOL bWatchSubtree, // 是否監(jiān)視此項的子鍵
DWORD dwNotifyFilter, // 監(jiān)視哪些變化
HANDLE hEvent, // 接受注冊表變化事件的事件對象句柄
BOOL fAsynchronous// 注冊表變化前報告還是注冊表變化后才報告
);
注意上面的hEvent是接受注冊表變化事件的事件對象句柄,我們要用API:CreateEvent來創(chuàng)建一個系統(tǒng)事件對象。
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES結(jié)構(gòu)
BOOL bManualReset, // 是否自動重置
BOOL bInitialState, // 是否設置初始狀態(tài)
LPCTSTR lpName// 事件對象的名稱
);
新建一個工程,添加一個ListBox,兩個Button。
//先寫個監(jiān)視注冊表的例子
//監(jiān)視HKEY_CURRENT_USER\\Software項下所有子鍵
procedure TForm1.Button1Click(Sender: TObject);
var
hNotify : THandle;
hKeyx : HKEY;
dwRes : DWORD;
begin
hNotify := CreateEvent( nil, //不使用SECURITY_ATTRIBUTES結(jié)構(gòu)
FALSE, //不自動重置
TRUE,//設置初始狀態(tài)
\’RegistryNotify\’ //事件對象的名稱
);
if hNotify = 0 then
begin
Showmessage(\’CreateEvent failed.\’);
exit;
end;
if RegOpenKeyEx( HKEY_CURRENT_USER, //跟鍵
\’Software\’, //子鍵
0, //reserved
KEY_NOTIFY, //監(jiān)視用
hKeyx //保存句柄
) <> ERROR_SUCCESS then
begin
CloseHandle( hNotify );
Showmessage(\’RegOpenKeyEx failed.\’);
exit;
end;
if RegNotifyChangeKeyValue( hKeyx, //監(jiān)視子鍵句柄
TRUE, //監(jiān)視此項的子鍵
REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET,
hNotify, //接受注冊表變化事件的事件對象句柄
TRUE //注冊表變化前報告
) <> ERROR_SUCCESS then