我将运行一个程序~~让他在后天监控注册表特定的一个健(自己可以指定),当别的程序要对所监控的键进行改动的时候,程序将自动提示~~~
并给出该程序名称和被改动的键值
请问该怎么实现~~~~~谢谢大家~~~:-)

解决方案 »

  1.   

    用DLL+Hook来实现。将DLL加在到内存中,然后HOOK 注册表访问函数,让那些函数重定向到你内存中的DLL中,然后当你的DLL的那些HOOK函数被执行的时候,你就可以通过GetCurrentProcess来得到进程ID,然后创建系统快照,比较哪个的进程ID是你找到的.然后你就可以得到修改注册表的程序名了...麻烦了点,估计只能这样了,呵呵
      

  2.   

    如果你不用DLL,而是用你的函数来HOOK的话,那样这个思路无效
      

  3.   

    有没有具体的代码阿~~
    对于Hook我可是白痴~~~
    楼上的大哥,能不能给出具体代码~~~
    简单而有效的~`
      

  4.   

    监视注册表的某一个位置的值的变化    
        
    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;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,registry,StdCtrls;constmachine_rootkey=HKEY_LOCAL_MACHINE;user_rootkey=HKEY_CURRENT_USER;defaultuser_rootkey=HKEY_USERS;subkey1='SOFTWARE';subkey2='SOFTWARE';function regmonitor(hkeys:hkey;keys:string):boolean;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Memo1: TMemo;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}function regmonitor(hkeys:hkey;keys:string):boolean;varreg1:tregistry;beginreg1:=tregistry.Create;reg1.RootKey:=hkeys;tryreg1.OpenKey(keys,false);//我的问题是在这下面的几句,当我执行时,如果注册表里我指定的键没被改变过,程序//好像失去响应一样,你试试就知道了,也许要用多线程才行,不过我后来没去试了application.ProcessMessages;if RegNotifyChangeKeyValue(reg1.CurrentKey,false,REG_NOTIFY_CHANGE_NAME+REG_NOTIFY_CHANGE_LAST_SET,0,false)=ERROR_SUCCESS thenresult:=trueelseresult:=false;finallyreg1.CloseKey;reg1.Free;end;end;procedure TForm1.Button1Click(Sender: TObject);beginmemo1.Lines.Clear;if regmonitor(machine_rootkey,subkey1) thenmemo1.Lines.Add('registry is monitored')elsememo1.Lines.Add('registry monitors fail');end;end. 
     
      

  5.   

    ...................
    为什么要都那么复杂?楼主只不过是要监视一个键而已
    你程序运行的时候把你要监视读出,写入一个ini文件(下次就不用读了,同时也可以作为比较),然后用定时器,定期获得那个键的值,与原来的比较就可以了
    不过,定时器好象挺消耗系统资源的~~
      

  6.   

    谢谢大家~~不过ypyRock(Rock) 同志
    我是菜鸟萨,要是明白如何用Hook做这个,我就不来CSDN找大家帮忙了~`
    嗯~那个用定时器我试过~~效果一般
    而且无法获得一些相关信息~~~
    不过这个做起来简单~`~但是有没有更彻底的~~
    Hook我的确不回,有没有高手指导~~
    给点意见,或者给个全面一些的源代码~~~楼上的Means_pan(酷鱼-真的是"难得胡涂") 谢谢你的代码~~
    我在调试,如果成功了的话,我马上来结贴
    我不是小气之人,弄好了,在加分阿~~:-)
    大家如果有什么新的意见。麻烦尽量多多提出,让小弟参考~~谢谢大家拉~~