可能要参考一些windwos地层的资料,因为当程序需要对注册表进行操作的时候,肯定会有一些消息发生的,可以通过这样去监视注册表

解决方案 »

  1.   

    1、在Delphi中建立一个新的Project,将Form1改名为FormMain 
    2、在FormMain上放置一个定时器控件TTimer,将Project保存为PiRegWatch.Dpr 
    3、修改PiRegWatch.Dpr中的代码: 
     Application.Initialize; 
    Application.CreateForm(TFormMain, FormMain); 
    //使主窗口启动时不显示 
    Application.ShowMainForm:=False; 
    Application.Run; 
    在FormMain中增加几个对象。 
    对象类型说明 
    RegTregistry用于注册表的访问 
    IniFileTiniFile用于保存原始注册表数据 
    LogTstringList用于记录变化的日志 
    RegKeysTstringList用于存放Run分支下的主键名 
    4、在FormMain:OnCreate事件中保留原始注册表数据,主要代码如下: 
    …… 
    self.Reg:=TRegistry.Create; 
    with self.Reg do 
    begin 
    RootKey:=HKEY_Local_Machine; 
    If OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',false)  
    then 
    begin 
    RegKeys:=TStringList.Create; 
    GetValueNames(RegKeys); //取得Run下面的所有主键名 
    if not self.IniFile.SectionExists('RunList') then //如果没有保存过数据 
    begin 
    for i:=0 to Regkeys.Count-1 do //保存原始数据 
    if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) 
    or(self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) 
    then begin 
    value:=self.Reg.ReadString(RegKeys.Strings[i]); 
    self.IniFile.WriteString('RunList',RegKeys.Strings[i],value); 
    end; 
    end; 
    end; 
    end; 
    …… 
    5、在TTimer1.OnTmer事件中加入比较注册表的代码。主要代码如下: 
    procedure TFormMain.Timer1Timer(Sender: TObject); 
    var i:integer; 
    RegVal,IniVal:string; 
    begin 
    self.Timer1.Enabled:=False; 
    self.Reg.GetValueNames(RegKeys); 
    for i:=0 to RegKeys.Count-1 do //检查新加的和已修改了的键值 
    if (self.Reg.GetDataType(RegKeys.Strings[i])=rdString) 
    or (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) 
    then begin 
    RegVal:=self.Reg.ReadString(RegKeys.Strings[i]); 
    IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); 
    if RegVal<>IniVal then 
    begin 
    self.LogMsg('Item Add:'+RegKeys.Strings[i]+'='+RegVal); 
    self.IniFile.WriteString('RunList',RegKeys.Strings[i],RegVal); 
    try 
    //提示用户 
    SendMsg('ABC','','注册表被改变:新增项目'+RegKeys.Strings[i]+'='+RegVal); 
    finally 
    end; 
    end; 
    end; 
     
    self.IniFile.ReadSection('RunList',RegKeys); 
    for i:=0 to RegKeys.Count-1 do //检查已被删除的键值 
    begin 
    IniVal:=self.IniFile.ReadString('RunList',RegKeys.Strings[i],''); 
    if self.Reg.ValueExists(RegKeys.Strings[i]) and 
    ((self.Reg.GetDataType(RegKeys.Strings[i])=rdString) 
    or (self.Reg.GetDataType(RegKeys.Strings[i])=rdExpandString) ) 
    then 
    RegVal:=self.Reg.ReadString(RegKeys.Strings[i]) 
    else 
    RegVal:=''; 
    if (IniVal<>'') and (RegVal='') then 
    begin 
    self.LogMsg('Item Del:'+RegKeys.Strings[i]+'='+IniVal); 
    self.IniFile.DeleteKey('RunList',RegKeys.Strings[i]); 
    try 
    SendMsg('ABC','','注册表被改变:项目删除'+RegKeys.Strings[i]+'='+IniVal); 
    finally 
    end; 
    end; 
    end; 
    self.IniFile.UpdateFile; 
    self.Timer1.Enabled:=True; 
    end; 
    6、在FormMain:OnClose事件中进行对象释放及必要的清理工作 
    procedure TFormMain.FormClose(Sender: TObject; var Action:TCloseAction); 
    begin 
    if Assigned(self.Reg) then self.Reg.Free; 
    if Assigned(self.IniFile) then self.IniFile.Free; 
    if Assigned(self.LogFile) then self.LogFile.Free; 
    if Assigned(self.RegKeys) then self.RegKeys.Free; 
    end; 
      

  2.   

    我记得有个监视注册表的API的
    叫什么 Notify 的
    你可以看看