コピー フック ハンドラーを作成する方法

シェル拡張ハンドラーを実装および登録するための一般的な手順については、「 シェル拡張ハンドラーの作成」を参照してください。 このドキュメントでは、コピー フック ハンドラーに固有の実装の側面について説明します。

Instructions

手順 1: コピー フック ハンドラーの実装

すべてのシェル拡張ハンドラーと同様に、コピー フック ハンドラーは、DLL として実装されるインプロセス コンポーネント オブジェクト モデル (COM) オブジェクトです。 IUnknown: ICopyHook に加えて、1 つのインターフェイスをエクスポートします。 シェルはハンドラーを直接初期化するため、 IShellExtInit などの初期化インターフェイスは必要ありません。

ICopyHook インターフェイスには、単一のメソッド ICopyHook::CopyCallback があります。 フォルダーが移動されようとしている場合、シェルはこのメソッドを呼び出します。 次のようなさまざまな情報が渡されます。

  • フォルダーの名前。
  • フォルダーの宛先または新しい名前。
  • 試行中の操作。
  • ソース フォルダーとコピー先フォルダーの属性。
  • ユーザー インターフェイスを表示するために使用できるウィンドウ ハンドル。

ハンドラーの ICopyHook::CopyCallback メソッドが呼び出されると、次の 3 つの値のいずれかを返して、処理の進め方をシェルに示します。

説明
IDYES 操作を許可します。
IDNO このフォルダーに対する操作を禁止します。 シェルは、バッチ コピー操作など、承認されたその他の操作を続行できます。
IDCANCEL 現在の操作を禁止し、保留中の操作をすべて取り消します。

 

手順 2: コピー フック ハンドラーの登録

フォルダーのコピー フック ハンドラーは、 HKEY_CLASSES_ROOT\Directory\shellex\CopyHookHandlers サブキーの下に登録されます。 ハンドラー用に という名前の CopyHookHandlers のサブキーを作成し、サブキーの既定値をハンドラーのクラス識別子 (CLSID) GUID の文字列形式に設定します。

次の例では、 MyCopyHandler サブキーをシェルのコピー フック ハンドラーの一覧に追加します。

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

プリンター オブジェクトのコピー フック ハンドラーは、基本的に同じ方法で登録されます。 唯一の違いは、 HKEY_CLASSES_ROOT\Printers サブキーに登録する必要がある点です。

注釈

通常、ユーザーとアプリケーションは、いくつかの制限でフォルダーのコピー、移動、削除、または名前変更を行うことができます。 コピー フック ハンドラーを実装することで、これらの操作を実行するかどうかを制御できます。 たとえば、このようなハンドラーを実装すると、重要なフォルダーの名前が変更されたり削除されたりするのを防ぐことができます。 コピー フック ハンドラーは、プリンター オブジェクトに実装することもできます。

コピー フック ハンドラーはグローバルです。 シェルは、アプリケーションまたはユーザーがフォルダーまたはプリンター オブジェクトのコピー、移動、削除、または名前変更を試みるたびに、登録されているすべてのハンドラーを呼び出します。 ハンドラーは操作自体を実行しません。 承認または拒否するだけです。 すべてのハンドラーが承認すると、シェルによって操作が実行されます。 いずれかのハンドラーが操作を拒否した場合、操作は取り消され、残りのハンドラーは呼び出されません。 コピー フック ハンドラーには操作の成功または失敗が通知されないため、ファイル操作を監視するために使用することはできません。

シェル拡張機能ハンドラーの作成

ICopyHook