修改注册表后,如何用delphi来监视注册表被修改,系统有没有什么消息?如何截获这些消息?用 delphi锁定注册表后,用程序依然能够打开,如何避免这个问题,让程序不能打开。

解决方案 »

  1.   

    前人所写SHELL32.DLL:
    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.
      

  2.   

    中国黑客中不就用了RegNotifyChangeKeyValue这个函数吗?
      

  3.   

    在win2000裡,有對注冊表修改的權限設置,這樣即使打開了注冊表也不能修改或DEL。
      

  4.   

    關注
    http://www.csdn.net/expert/topic/1049/1049650.xml?temp=3.348941E-02
    可能可以找到你要的答案