如何创建复制挂钩处理程序

创建 Shell 扩展处理程序中讨论了实现和注册 Shell 扩展处理程序的一般过程。 本文档重点介绍特定于复制挂钩处理程序的实现的那些方面。

Instructions

步骤 1:实现复制挂钩处理程序

与所有 Shell 扩展处理程序一样,复制挂钩处理程序是进程内组件对象模型 (COM) 作为 DLL 实现的对象。 除了 IUnknown 之外,还导出一个接口: ICopyHook。 Shell 直接初始化处理程序,因此不需要初始化接口(如 IShellExtInit)。

ICopyHook 接口有一个方法,即 ICopyHook::CopyCallback。 当文件夹即将移动时,Shell 会调用此方法。 它传入各种信息,包括:

  • 文件夹的名称。
  • 文件夹的目标名称或新名称。
  • 正在尝试的操作。
  • 源文件夹和目标文件夹的属性。
  • 可用于显示用户界面的窗口句柄。

调用处理程序的 ICopyHook::CopyCallback 方法时,它将返回以下三个值之一,以指示它应如何继续。

说明
IDYES 允许操作。
IDNO 阻止对此文件夹的操作。 Shell 可以继续执行已批准的任何其他操作,例如批量复制操作。
IDCANCEL 阻止当前操作并取消任何挂起的操作。

 

步骤 2:注册复制挂钩处理程序

文件夹的复制挂钩处理程序在 HKEY_CLASSES_ROOT\Directory\shellex\CopyHookHandlers 子项下注册。 为处理程序创建名为 的 CopyHookHandlers 子项,并将子项的默认值设置为处理程序的类标识符的字符串形式, (CLSID) GUID。

以下示例将 MyCopyHandler 子项添加到 Shell 的复制挂钩处理程序列表中。

HKEY_CLASSES_ROOT
   Directory
      shellex
         CopyHookHandlers
            MyCopyHandler
               (Default) = {MyCopyHandler CLSID GUID}

打印机对象的复制挂钩处理程序基本上以相同的方式注册。 唯一的区别是,必须在\HKEY_CLASSES_ROOT打印机”子项下注册它们。

备注

通常,用户和应用程序可以复制、移动、删除或重命名文件夹,但限制很少。 通过实现复制挂钩处理程序,可以控制是否执行这些操作。 例如,实现此类处理程序可以阻止重命名或删除关键文件夹。 还可以为打印机对象实现复制挂钩处理程序。

复制挂钩处理程序是全局性的。 每次应用程序或用户尝试复制、移动、删除或重命名文件夹或打印机对象时,Shell 都会调用所有已注册的处理程序。 处理程序本身不执行操作。 它只批准或否决它。 如果所有处理程序都批准,则 Shell 会执行该操作。 如果任何处理程序否决了操作,则会取消该操作,并且不会调用剩余的处理程序。 复制挂钩处理程序不会通知操作成功或失败,因此它们不能用于监视文件操作。

创建 Shell 扩展处理程序

ICopyHook