如题!

解决方案 »

  1.   

    你是不是要截掉DELETE事件啊!
      

  2.   

    是, 当发现windows要删除有个文件时暂停删除操作, 等待应用程序执行完其他的操作后继续执行删除操作!  怎么搞!?
      

  3.   

    楼上的,不会查MSDN啊?巨简单……
      

  4.   

    要使用文件钩子,具体细节我也不清楚,好像有本书《Delphi下深入Windows核心编程》中讲到了。
      

  5.   

    是啊,我对windows编程很感兴趣,请各位前辈多讲讲,让我多学习学习
      

  6.   

    Delphi下深入Windows核心编程
    查啦,说写的很烂
      

  7.   

    强烈邀请 Kingron(单身走我路……) 为大家详细讲解一下   大家觉得如何??
      

  8.   

    應該可以在DELPHI裡檢查消息﹐是DELETE留下﹐其他的放過交給系統處理(以前好像見過類似的程序﹐就是現在找不到了)
      

  9.   

    D4DG的例子:
    ICopyHook。unit CopyMain;interfaceuses Windows, ComObj, ShlObj;type
      TCopyHook = class(TComObject, ICopyHook)
      protected
        function CopyCallback(Wnd: HWND; wFunc, wFlags: UINT; pszSrcFile: PAnsiChar;
          dwSrcAttribs: DWORD; pszDestFile: PAnsiChar; dwDestAttribs: DWORD): UINT; stdcall;
      end;  TCopyHookFactory = class(TComObjectFactory)
      protected
        function GetProgID: string; override;
        procedure ApproveShellExtension(Register: Boolean; const ClsID: string);
          virtual;
      public
        procedure UpdateRegistry(Register: Boolean); override;
      end;implementationuses ComServ, SysUtils, Registry;{ TCopyHook }// This is the method which is called by the shell for folder operations
    function TCopyHook.CopyCallback(Wnd: HWND; wFunc, wFlags: UINT;
      pszSrcFile: PAnsiChar; dwSrcAttribs: DWORD; pszDestFile: PAnsiChar;
      dwDestAttribs: DWORD): UINT;
    const
      MyMessage: string = 'Are you sure you want to delete with "%s"?';
    begin
      // confirm operation
      case wFunc of
        $3: Result := MessageBox(Wnd,  PChar(Format(MyMessage, [pszSrcFile])),
        'D4DG Shell Extension', MB_YESNO);
      end;
    end;{ TCopyHookFactory }function TCopyHookFactory.GetProgID: string;
    begin
      // ProgID not needed for shell extension
      Result := '';
    end;procedure TCopyHookFactory.UpdateRegistry(Register: Boolean);
    var
      ClsID: string;
    begin
      ClsID := GUIDToString(ClassID);
      inherited UpdateRegistry(Register);
      ApproveShellExtension(Register, ClsID);
      if Register then
        // add shell extension clsid to CopyHookHandlers reg entry
        CreateRegKey('directory\shellex\CopyHookHandlers\' + ClassName, '',
          ClsID)
      else
        DeleteRegKey('directory\shellex\CopyHookHandlers\' + ClassName);
    end;procedure TCopyHookFactory.ApproveShellExtension(Register: Boolean;
      const ClsID: string);
    // This registry entry is required in order for the extension to
    // operate correctly under Windows NT.
    const
      SApproveKey = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved';
    begin
      with TRegistry.Create do
        try
          RootKey := HKEY_LOCAL_MACHINE;
          if not OpenKey(SApproveKey, True) then Exit;
          if Register then WriteString(ClsID, Description)
          else DeleteValue(ClsID);
        finally
          Free;
        end;
    end;const
      CLSID_CopyHook: TGUID = '{66CD5F60-A044-11D0-A9BF-00A024E3867F}';initialization
      TCopyHookFactory.Create(ComServer, TCopyHook, CLSID_CopyHook,
        'D4DG_CopyHook', 'D4DG Copy Hook Shell Extension Example',
        ciMultiInstance, tmApartment);
    end.
      

  10.   

    24.4.2 复制钩子处理器
    正如前面提到的,安装了复制钩子扩展后,当一个文件夹被复制、删除、移动或重命名时将发出
    通知。收到通知后,处理器就可以阻止上述操作。注意,这类处理器仅适用于文件夹或打印机对象,
    不适用于文件或其他类型的对象。
    要创建一个复制钩子处理器,第一步是创建一个T C o m O b j e c t派生类,并实现I C o p y H o o k接口。这
    个接口在S h l O b j单元中是这样声明的:
    1.
    1. CopyCallback()方法
    正如你所看到的, I C o p y H o o k是一个非常简单的接口,它只有一个函数,即C o p y C a l l b a c k ( )。当外
    壳文件夹被操作时,这个函数就会被调用。
    W n d是一个窗口的句柄,复制钩子处理器以此作为它要显示的窗口的父窗口。w F u n c表明要被执
    行的操作。它可以取表2 4 - 5中所列的任一个值。
    表24-5 位w F u n c的取值
    常量值含义
    F O _ C O P Y $ 2 复制由p s z S r c F i l e指定的文件到由p s z D e s t F i l e指定的位置
    F O _ D E L E T E $ 3 删除由p s z S r c F i l e指定的文件
    F O _ M O V E $ 1 移动由p s z S r c F i l e指定的文件到由p s z D e s t F i l e指定的位置
    F O _ R E N A M E $ 4 重命名由p s z S r c F i l e指定的文件
    P O _ D E L E T E $ 1 3 删除由p s z S r c F i l e指定的打印机
    P O _ P O RT C H A N G E $ 2 0 改变打印机端口。p s z S r c F i l e和p s z D e s t F i l e是两个以n u l l结尾
    的字符串,分别用于指定当前的和新的打印机端口名
    P O _ R E N A M E $ 1 4 重命名由p s z S r c F i l e指定的打印机
    P O _ R E N _ P O RT $ 3 4 P O _ R E N A M E和P O _ P O RT C H A N G E的组合
    w F l a g s参数包含操作标志,其取值可以是表2 4 - 6所示值的组合。
    表24-6 wFlags的取值
    常量值含义
    F O F _ A L L O W U N D O $ 4 0 保留U n d o信息
    F O F _ M U LT I D E S T F I L E S $ 1 SHFileOperation()用于指定多个目标文件(一个源文
    件对应一个),而不是一个所有源文件存放的目录。
    复制钩子处理器忽略此值
    F O F _ N O C O N F I R M AT I O N $ 1 0 用“Yes to All”影响所有对话框
    F O F _ N O C O N F I R M M K D I R $ 2 0 0 如果需要创建一个新的目录,不予确认
    F O F _ R E N A M E O N C O L L I S I O N $ 8 如果目标已存在就重命名
    F O F _ S I L E N T $ 4 不显示进度对话框
    F O F _ S I M P L E P R O G R E S S $ 1 0 0 显示一个进度对话框但不显示文件名
    p s z S o u r c e F i l e是源文件夹名, d w S r c A t t r i b s是源文件夹的属性, p s z D e s t F i l e是目标文件夹名,
    d w D e s t A t t r i b s是目标文件夹的属性。
    与其他方法不同的是,这个接口返回的不是O L E结果代码,而是返回表2 4 - 7中所列的值,这些值
    是在Wi n d o w s单元中定义的。
    第2 4章扩展Wi n d o w s外壳8 3 3
    表24-7 wFlags的值
    常量值意义
    I D Y E S 6 允许操作
    I D N O 7 阻止操作,但其他操作继续
    I D C A N C E L 2 阻止当前操作,取消所有未完成的操作
    2. 实现T C o p y H o o k

    8 3 4 第三部分基于组件的开发