注册表问题,高手请进。我给200分 修改注册表后,如何用delphi来监视注册表被修改,系统有没有什么消息?如何截获这些消息?用 delphi锁定注册表后,用程序依然能够打开,如何避免这个问题,让程序不能打开。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 前人所写SHELL32.DLL:RegNotifyChangeKeyValueSHChangeNotifyDeregisterHANDLE WINAPI SHChangeNotifyRegister(HWND hWnd,DWORD dwFlags,LONG wEventMask,UINT uMsg,DWORD cItems, LPCNOTIFYREGISTER lpItems); index 2; BOOL WINAPI SHChangeNotifyDeregister(HANDLE hNotify);index 4; //hNotify Come form SHChangeNotifyRegisterHANDLE WINAPI SHChangeNotification_Lock(HANDLE hMemoryMap,DWORD dwProcessId,LPCITEMIDLIST **lppidls,LPLONG lpwEventId); index 644; BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock); index 645;Ex:LPCITEMIDLIST *pidls;LONG wEventId;if (bRunningWindowsNT) { HANDLE hLock; hLock = SHChangeNotification_Lock( (HANDLE)wParam, (DWORD)lParam, &pidls, &wEventId); if (hLock) { ProcessEvent(wEventId, pidls[0], pidls[1]); SHChangeNotification_Unlock(hLock); }}else { pidls = (LPCITEMIDLIST*)wParam; wEventId = (LONG)lParam; ProcessEvent(wEventId, pidls[0], pidls[1]);}我曾经做过一测试的程序,不过有点问题,我把全部代码贴出来吧:unit reg1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,registry, StdCtrls;const machine_rootkey=HKEY_LOCAL_MACHINE; user_rootkey=HKEY_CURRENT_USER; defaultuser_rootkey=HKEY_USERS; subkey1='SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN'; subkey2='SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\Run-'; function regmonitor(hkeys:hkey;keys:string):boolean;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}function regmonitor(hkeys:hkey;keys:string):boolean;var reg1:tregistry;begin reg1:=tregistry.Create; reg1.RootKey:=hkeys; try reg1.OpenKey(keys,false);//我的问题是在这下面的几句,当我执行时,如果注册表里我指定的键没被改变过,程序//好像失去响应一样,你试试就知道了,也许要用多线程才行,不过我后来没去试了 application.ProcessMessages; if RegNotifyChangeKeyValue(reg1.CurrentKey,false,REG_NOTIFY_CHANGE_NAME+REG_NOTIFY_CHANGE_LAST_SET,0,false)=ERROR_SUCCESS then result:=true else result:=false; finally reg1.CloseKey; reg1.Free; end; end;procedure TForm1.Button1Click(Sender: TObject);begin memo1.Lines.Clear; if regmonitor(machine_rootkey,subkey1) then memo1.Lines.Add('registry is monitored') else memo1.Lines.Add('registry monitors fail');end;end. 中国黑客中不就用了RegNotifyChangeKeyValue这个函数吗? 在win2000裡,有對注冊表修改的權限設置,這樣即使打開了注冊表也不能修改或DEL。 關注http://www.csdn.net/expert/topic/1049/1049650.xml?temp=3.348941E-02可能可以找到你要的答案 Delphi 定时清理内存的方法? 求delphi 7下载连接 将WSDl成功导入后,编译时提示导入的单元有错误,详细信息见。。。(高分) 请高手帮忙解决修改IP后出现的乱码问题!! 求有關技術:繁簡體轉換,具體要求請入內。 工作户口问题?请已经在工作的朋友帮帮忙!! 在DELPHI7中 一个工程怎样引用另一个工程的窗体和变量 11月18日的Borland开发者大会2003,有谁去啊? 关于form创建的问题 哪里有对DELPHI源码排版的软件呀??我记得钱达智编了一个,可是不知道哪里有下载!!!! 您好,请教如下问题,谢谢。 一个小问题!
RegNotifyChangeKeyValue
SHChangeNotifyDeregister
HANDLE WINAPI SHChangeNotifyRegister(HWND hWnd,DWORD dwFlags,LONG wEventMask,UINT uMsg,DWORD cItems, LPCNOTIFYREGISTER lpItems); index 2;
BOOL WINAPI SHChangeNotifyDeregister(HANDLE hNotify);index 4; //hNotify Come form SHChangeNotifyRegisterHANDLE WINAPI SHChangeNotification_Lock(HANDLE hMemoryMap,DWORD dwProcessId,LPCITEMIDLIST **lppidls,LPLONG lpwEventId); index 644;
BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock); index 645;Ex:
LPCITEMIDLIST *pidls;
LONG wEventId;
if (bRunningWindowsNT) {
HANDLE hLock;
hLock = SHChangeNotification_Lock(
(HANDLE)wParam, (DWORD)lParam,
&pidls, &wEventId);
if (hLock) {
ProcessEvent(wEventId,
pidls[0], pidls[1]);
SHChangeNotification_Unlock(hLock);
}
}
else {
pidls = (LPCITEMIDLIST*)wParam;
wEventId = (LONG)lParam;
ProcessEvent(wEventId,
pidls[0], pidls[1]);
}我曾经做过一测试的程序,不过有点问题,我把全部代码贴出来吧:
unit reg1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,registry,
StdCtrls;
const
machine_rootkey=HKEY_LOCAL_MACHINE;
user_rootkey=HKEY_CURRENT_USER;
defaultuser_rootkey=HKEY_USERS;
subkey1='SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN';
subkey2='SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\Run-';
function regmonitor(hkeys:hkey;keys:string):boolean;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}
function regmonitor(hkeys:hkey;keys:string):boolean;
var
reg1:tregistry;
begin
reg1:=tregistry.Create;
reg1.RootKey:=hkeys;
try
reg1.OpenKey(keys,false);
//我的问题是在这下面的几句,当我执行时,如果注册表里我指定的键没被改变过,程序
//好像失去响应一样,你试试就知道了,也许要用多线程才行,不过我后来没去试了
application.ProcessMessages;
if RegNotifyChangeKeyValue(reg1.CurrentKey,false,REG_NOTIFY_CHANGE_NAME+REG_NOTIFY_CHANGE_LAST_SET,0,false)=ERROR_SUCCESS then
result:=true
else
result:=false;
finally
reg1.CloseKey;
reg1.Free;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Clear;
if regmonitor(machine_rootkey,subkey1) then
memo1.Lines.Add('registry is monitored')
else
memo1.Lines.Add('registry monitors fail');end;end.
http://www.csdn.net/expert/topic/1049/1049650.xml?temp=3.348941E-02
可能可以找到你要的答案