我现在需要监视系统文件的操作,如果对文件进行复制,删除,移动或者重新命名的时候,我需要先弹出我自己定义好的一个密码框。
请问用钩子函数实现可以吗?如果可以的话,需要安装什么样类型的钩子。如果不可以的话,那么该如何实现,可以说说思路吗?最好给点代码.

解决方案 »

  1.   

    //通过ShellAPI函数来实现比较科学~~
    //注册一个事件响应~~
    //代码如下~~
    //zswang
    unit unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ShlObj, ShellAPI;const
      WM_SHNOTIFY = WM_USER + 10;type
      TForm1 = class(TForm)
        MemoNotifyLog: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        FNotifyHandle: THandle;
        procedure WMSHNOTIFY(var Msg: TMessage); message WM_SHNOTIFY;
      public
        { Public declarations }
      end;var
      FOrm1: Tform1;implementation{$WARNINGS OFF}
    uses FileCtrl;{$R *.dfm}type
      NOTIFYREGISTER = packed record
        pidlPath: PItemIDList;
        bWatchSubtree: BOOL;
      end;
      PNotifyRegister = ^NOTIFYREGISTER;  function SHChangeNotifyRegister(hWnd: HWND; dwFlags: Integer;
        wEventMask: Cardinal; uMsg: UINT; cItems: Integer;
        lpItems: PNotifyRegister): HWND; stdcall; external Shell32 index 2;  function SHChangeNotifyDeregister(hWnd: HWND): Boolean; stdcall;
        external Shell32 index 4;  function SHILCreateFromPath(pszPath: PChar; ppidl: PItemIDList;
        rgflnOut: PDWORD): HResult; stdcall; external Shell32 index 28;
    {$WARNINGS ON}procedure Tform1.FormCreate(Sender: TObject);
    var
      vNotifyRegister: NOTIFYREGISTER;
      vAttributes: WORD;
      vItemIDList: PItemIDList;
      Dir: string;
    const
      SELDIRHELP = 1000;
    begin
      Dir := '我的电脑';
    //if SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP) then ;
      Caption := '目录监视:' + Dir;
      SHILCreatefromPath(PChar(Dir), @vItemIDList, @vAttributes);
      vNotifyRegister.pidlPath := vItemIDList;
      vNotifyRegister.bWatchSubtree := True;  FNotifyHandle := SHChangeNotifyRegister(Handle, SHCNF_TYPE or SHCNF_IDLIST,
        SHCNE_ALLEVENTS or SHCNE_INTERRUPT, WM_SHNOTIFY, 1, @vNotifyRegister);  MemoNotifyLog.Clear;
    end;procedure Tform1.FormDestroy(Sender: TObject);
    begin
      SHChangeNotifyDeregister(FNotifyHandle);
    end;procedure Tform1.WMSHNOTIFY(var Msg: TMessage);
    type
      PSHNOTIFYSTRUCT = ^SHNOTIFYSTRUCT;
      SHNOTIFYSTRUCT = packed record
        dwItem1: PItemIDList;
        dwItem2: PItemIDList;
      end;
    var
      vBuffer: array[0..MAX_PATH] of Char;
      pidlItem: PSHNOTIFYSTRUCT;
      S: string;
    begin
      pidlItem := PSHNOTIFYSTRUCT(Msg.wParam);
      SHGetPathFromIDList(pidlItem.dwItem1, vBuffer);
      S := vBuffer;
      SHGetPathFromIDList(pidlItem.dwItem2, vBuffer);
      case Msg.lParam of //根据参数设置提示消息
        SHCNE_RENAMEITEM: S := '重命名文件' + S + '为' + vBuffer;
        SHCNE_CREATE: S := '建立文件 文件名:' + S;
        SHCNE_DELETE: S := '删除文件 文件名:' + S;
        SHCNE_MKDIR: S := '新建目录 目录名:' + S;
        SHCNE_RMDIR: S := '删除目录 目录名:' + S;
        SHCNE_MEDIAINSERTED: S := S + '中插入可移动存储介质';
        SHCNE_MEDIAREMOVED: S := S + '中移去可移动存储介质' + S + ' ' + vBuffer;
        SHCNE_DRIVEREMOVED: S := '移去驱动器' + S;
        SHCNE_DRIVEADD: S := '添加驱动器' + S;
        SHCNE_NETSHARE: S := '改变目录' + S + '的共享属性';
        SHCNE_ATTRIBUTES: S := '改变文件目录属性 文件名' + S;
        SHCNE_UPDATEDIR: S := '更新目录' + S;
        SHCNE_UPDATEITEM: S := '更新文件 文件名:' + S;
        SHCNE_SERVERDISCONNECT: S := '断开与服务器的连接' + S + ' ' + vBuffer;
        SHCNE_UPDATEIMAGE: S := 'SHCNE_UPDATEIMAGE';
        SHCNE_DRIVEADDGUI: S := 'SHCNE_DRIVEADDGUI';
        SHCNE_RENAMEFOLDER: S := '重命名文件夹' + S + '为' + vBuffer;
        SHCNE_FREESPACE: S := '磁盘空间大小改变';
        SHCNE_ASSOCCHANGED: S := '改变文件关联';
      else S := '未知操作' + IntToStr(Msg.lParam);
      end;
      MemoNotifyLog.Lines.Add(DateTimeTostr(Now)+' '+S);
    end;end.
      

  2.   

    要实现这样的功能,用hook技术吧,如果只是拦截windows的shell对文件的操作,对windows shell函数SHFileOperation进行hook即可
      

  3.   

    是用一般的HOOK还是APIHook ?
      

  4.   

    给你个文件夹监视的例子吧,加我:
    [email protected]