Delphi实现对注册表的监视和扫描

时间:2010-01-26 12:53:25  来源:第二电脑网  作者:第二电脑网

  第二电脑网导读:视注册表相关项的改变要用到一个API:RegNotifyChangeKeyValue。LONG RegNotifyChangeKeyValue(HKEY hKey, // 要监视的一个项的句柄 BOOL bWatchSubtree, // 是否监视此项的子键...
  正文:

Delphi自带的TRegistry类只能实现注册表的基础操作,如果我们要实时监视注册表的变化或者扫描注册表特定项下的所有子项,TRegistry类就无能为力了。我啃了半天SDK,终于实现了Delphi对注册表的监视与扫描,不敢独享,拿来献给广大的Delphi爱好者。
监视注册表相关项的改变要用到一个API:RegNotifyChangeKeyValue。


LONG RegNotifyChangeKeyValue(

HKEY hKey, // 要监视的一个项的句柄
BOOL bWatchSubtree, // 是否监视此项的子键
Dword dwNotifyFilter, // 监视哪些变化
HANDLE hEvent, // 接受注册表变化事件的事件对象句柄
BOOL fAsynchronous // 注册表变化前报告还是注册表变化后才报告
);

注意上面的hEvent是接受注册表变化事件的事件对象句柄,我们要用API:CreateEvent来创建一个系统事件对象。


HANDLE CreateEvent(

Lphotoshop/ target=_blank class=infotextkey>psECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构
BOOL bManualReset, // 是否自动重置
BOOL bInitialState, // 是否设置初始状态
LPCTSTR lpName // 事件对象的名称
);

新建一个工程,添加一个ListBox,两个Button。


//先写个监视注册表的例子
//监视HKEY_CURRENT_USERSoftware项下所有子键
procedure TForm1.Button1Click(Sender: TObject);
var
hNotify : THandle;
hKeyx : HKEY;
dwRes : DWORD;
begin
  hNotify := CreateEvent( nil, //不使用SECURITY_ATTRIBUTES结构
FALSE, //不自动重置
TRUE, //设置初始状态
‘RegistryNotify‘ //事件对象的名称
);
  
  if hNotify = 0 then
  begin
    Showmessage(‘CreateEvent failed.‘);
    exit;
  end;
  
  if RegOpenKeyEx( HKEY_CURRENT_USER, //跟键
‘Software‘, //子键
0, //reserved
KEY_NOTIFY, //监视用
hKeyx //保存句柄
) <> ERROR_SUCCESS then
  begin
    CloseHandle( hNotify );
    Showmessage(‘RegOpenKeyEx failed.‘);
    exit;
  end;
  
  if RegNotifyChangeKeyValue( hKeyx, //监视子键句柄
TRUE, //监视此项的子键
REG_NOTIFY_CHANGE_NAME or REG_NOTIFY_CHANGE_LAST_SET,
  hNotify, //接受注册表变化事件的事件对象句柄
TRUE //注册表变化前报告
) <> ERROR_SUCCESS then
  begin
    CloseHandle( hNotify );
    RegCloseKey( hKeyx );
    Showmessage(‘RegNotifyChangeKeyValue failed‘);
    exit;
  end;
  
  dwRes := WaitForSingleObject( hNotify, 60 * 1000 ); //监视一分钟
if dwRes = 0 then
  Showmessage( ‘Registry will be changed.‘ );
  
  CloseHandle( hNotify );
  RegCloseKey( hKeyx );
end;

要注意的是,API: WaitForSingleObject要等到注册表变化事件发生或者超时才会返回,在此期间我们的程序将失去响应。解决的办法是新建一个线程,在新线程中监视注册表。

对注册表进行扫描要用到另外两个API: RegEnumKey和RegEnumValue。

"Delphi实现对注册表的监视和扫描"由第二电脑网原创提供,转载请注明:http://www.002pc.com/master/College/Language/Delphi/12420.html


关键字:

关于《Delphi实现对注册表的监视和扫描》文章的评论

站内搜索: 高级搜索

热门搜索: Windows style 系统 tr IP QQ CPU 安装 function 注册 if td