困扰我很久的暴难问题,监视注册表(要排除系统信息)。 通过消息机制,我们可以截获对注册表的操作,但是没有办法获得当前对哪个子键操作,及其操作信息,并且Windows本身对注册表还有很多操作信息,如何排除系统信息,只记录用户对注册表的操作,我现在实在是心穷筹策,力所不能及,还望高手指点, 如何时时监视用户对注册表操作?我相信不只一个好方法,等待高人。。 (注:循环注册表的方法最好不要,为了防止系统吐血。) Up有分,希望您提出宝贵意见。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转载一篇,不知道对你有用没有:Delphi实现对注册表的监视和扫描声明:CSDN以外的任合团体和个人转载本文必须注明出处和作者。 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( LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构 BOOL bManualReset, // 是否自动重置 BOOL bInitialState, // 是否设置初始状态 LPCTSTR lpName // 事件对象的名称 ); 新建一个工程,添加一个ListBox,两个Button。//先写个监视注册表的例子//监视HKEY_CURRENT_USER\Software项下所有子键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。 LONG RegEnumKey( HKEY hKey, // 要扫描的注册表项目句柄 DWORD dwIndex, // 要扫描的subkey序号 LPTSTR lpName, // 要扫描的subkey名称 LPDWORD lpcbName, // 要扫描的subkey名称占用空间 ); 此函数的使用方法是: 首先给dwIndex赋值0, 调用RegEnumKey; 然后Inc(dwIndex), 再调用RegEnumKey,直到返回值为ERROR_NO_MORE_ITEMS,表示没有更多的子项了。//扫描注册表的例子//只演示了如何枚举HKEY_CURRENT_USER\Software下的一层子项procedure TForm1.Button2Click(Sender: TObject);var buf : array [0..255] of char; iRes : integer; hKeyx : HKEY; dwIndex, dwSize : DWORD;begin if RegOpenKeyEx( HKEY_CURRENT_USER, 'Software', 0, KEY_READ or KEY_ENUMERATE_SUB_KEYS, hKeyx ) <> ERROR_SUCCESS then begin Showmessage('RegOpenKeyEx failed.'); exit; end; dwIndex := 0; repeat dwSize := 255; iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize ); if iRes = ERROR_NO_MORE_ITEMS then break else if iRes = ERROR_SUCCESS then begin Listbox1.Items.Add( buf ); Inc( dwIndex ); end; until iRes <> ERROR_SUCCESS; RegCloseKey( hKeyx );end; RegNotifyChangeKeyValue, 就我知道的, 也是這個函數, >>如何排除系统信息,只记录用户对注册表的操作,可能要自己過濾了! 这个函数只能监视一个子键,要监视多个还不累死你!你可以编一个VXD驱动程序再底层监视!有软件这样做到了!! RegMon 做了,而且看下面:If you are interested in redistributing Regmon, either in originalor modified form, or wish to use Regmom source code in a product,please send e-mail to [email protected] with details. VXD WMD,这类东东,能说编就编吗?敬请高人指点。 用这个函数RegNotifyChangeKeyValue试试 关于button得一个小问题。。。。 未来该怎么走 我是编程初学者(以前没有其它语言的经验),各位高手推荐几部Delphi的好书,和学习方法! 这样的报表是不是非得用三个report来做? 如何检测应用程序是否结束? 中国的软件路在何方 帮忙up也送分:CORBA开发中,irep.exe的使用——长久的困惑!! 有谁知道深圳市奥尊电脑有限公司上海分公司的情况? 设置Windows的颜色 怎样检测数据库表内容的变化,通知前台程序 不再为手机短信控件限制烦恼 如何让MediaPlayer1.Position识别这样的时间格式:00:38.10
BOOL bWatchSubtree, // 是否监视此项的子键
DWORD dwNotifyFilter, // 监视哪些变化
HANDLE hEvent, // 接受注册表变化事件的事件对象句柄
BOOL fAsynchronous // 注册表变化前报告还是注册表变化后才报告
); 注意上面的hEvent是接受注册表变化事件的事件对象句柄,我们要用API:CreateEvent来创建一个系统事件对象。 HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构
BOOL bManualReset, // 是否自动重置
BOOL bInitialState, // 是否设置初始状态
LPCTSTR lpName // 事件对象的名称
); 新建一个工程,添加一个ListBox,两个Button。//先写个监视注册表的例子
//监视HKEY_CURRENT_USER\Software项下所有子键
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。 LONG RegEnumKey(
HKEY hKey, // 要扫描的注册表项目句柄
DWORD dwIndex, // 要扫描的subkey序号
LPTSTR lpName, // 要扫描的subkey名称
LPDWORD lpcbName, // 要扫描的subkey名称占用空间
); 此函数的使用方法是: 首先给dwIndex赋值0, 调用RegEnumKey; 然后Inc(dwIndex), 再调用RegEnumKey,直到返回值为ERROR_NO_MORE_ITEMS,表示没有更多的子项了。//扫描注册表的例子
//只演示了如何枚举HKEY_CURRENT_USER\Software下的一层子项
procedure TForm1.Button2Click(Sender: TObject);
var
buf : array [0..255] of char;
iRes : integer;
hKeyx : HKEY;
dwIndex, dwSize : DWORD;
begin
if RegOpenKeyEx( HKEY_CURRENT_USER, 'Software', 0, KEY_READ or
KEY_ENUMERATE_SUB_KEYS, hKeyx ) <> ERROR_SUCCESS then
begin
Showmessage('RegOpenKeyEx failed.');
exit;
end; dwIndex := 0;
repeat
dwSize := 255;
iRes := RegEnumKey( hKeyx, dwIndex, buf, dwSize );
if iRes = ERROR_NO_MORE_ITEMS then
break
else if iRes = ERROR_SUCCESS then
begin
Listbox1.Items.Add( buf );
Inc( dwIndex );
end;
until iRes <> ERROR_SUCCESS; RegCloseKey( hKeyx );
end;
可能要自己過濾了!
你可以编一个VXD驱动程序再底层监视!有软件这样做到了!!
If you are interested in redistributing Regmon, either in original
or modified form, or wish to use Regmom source code in a product,
please send e-mail to [email protected] with details.