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

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

说明

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

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

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

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

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

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

 

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

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

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

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

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

注解

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

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

创建 Shell 扩展处理程序

ICopyHook