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中增加几个对象。 对象类型说明 RegTregistry用于注册表的访问 IniFileTiniFile用于保存原始注册表数据 LogTstringList用于记录变化的日志 RegKeysTstringList用于存放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、在FormMain上放置一个定时器控件TTimer,将Project保存为PiRegWatch.Dpr
3、修改PiRegWatch.Dpr中的代码:
Application.Initialize;
Application.CreateForm(TFormMain, FormMain);
//使主窗口启动时不显示
Application.ShowMainForm:=False;
Application.Run;
在FormMain中增加几个对象。
对象类型说明
RegTregistry用于注册表的访问
IniFileTiniFile用于保存原始注册表数据
LogTstringList用于记录变化的日志
RegKeysTstringList用于存放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;
叫什么 Notify 的
你可以看看