シェル名前空間拡張機能について

Windows エクスプローラー では、シェル名前空間をグラフィカルに表現し、ユーザーが Shell オブジェクトを操作できるようにするツールと組み合わせることができます。 名前空間拡張機能を使用すると、任意の本文のデータを取得し、Windows エクスプローラー仮想フォルダーとしてユーザーに提示させることができます。 ユーザーがこのフォルダーを参照すると、データは、Shell 名前空間の残りの部分と同様に、フォルダーとファイルのツリー構造の階層として表示されます。 ユーザーとアプリケーションは、他の名前空間オブジェクトとほとんど同じ方法で、この仮想フォルダーの内容を操作できます。 このドキュメントでは、名前空間拡張機能を作成する方法について説明します。

名前空間拡張機能のしくみ

バックグラウンドでは、Windows エクスプローラーが表示されるすべてのフォルダーは、フォルダー オブジェクトと呼ばれるコンポーネント オブジェクト モデル (COM) オブジェクトによって表されます。 ユーザーがフォルダーまたはその内容を操作するたびに、シェルは、いくつかの標準インターフェイスのいずれかを介して、関連付けられているフォルダー オブジェクトと通信します。 その後、フォルダー オブジェクトはユーザーのアクションに応答するために必要な処理を行い、シェルは Windows エクスプローラー表示を更新します。

ユーザーが操作するファイルとフォルダーの大部分は、ファイル システムまたはごみ箱などのシステム仮想フォルダーの一部です。 他のドキュメントでは、レジストリを変更するか 、シェル拡張ハンドラーを実装することで、アプリケーションの要件を満たすようにこれらの標準フォルダーの動作をカスタマイズする方法について説明しました。 ただし、これらの方法でシェルを拡張することは、通常のファイル システム ファイルまたはフォルダーの形式で情報を簡単にパッケージ化できる場合に最も便利です。

ファイル システムのフォルダーとファイルのコレクションとしてデータを格納することは望ましくない場合や不可能な場合もあります。 この種類のデータには、次のような例があります。

  • 1 つのファイル (データベースなど) に最も効果的にパッケージ化される項目のコレクション。
  • 標準の Windows ファイル システムを持たないリモート コンピューターに格納されている項目のコレクション。 このようなデータの例として、パーソナル デジタル アシスタント (PDA) またはデジタル カメラに格納されている情報があります。
  • 格納されているデータを表さない項目のコレクション。 このようなデータの例として、標準の Printers フォルダーに含まれるプリンター リンクがあります。

この種のデータをユーザーに提示する方法の 1 つは、ユーザーがさまざまな項目を表示および操作できるようにアプリケーションを作成することです。 ただし、データをフォルダー/ファイル階層として表示できる場合、実装する必要がある機能の多くは、Windows エクスプローラーによって既に提供されているユーザー インターフェイス サービスである可能性があります。 はるかに効率的な方法は、名前空間拡張機能を記述し、Windows エクスプローラーを GUI にすることです。

名前空間拡張機能を実装するには、情報をツリー構造の名前空間として整理する必要があります。 名前空間ルートは、シェル名前空間の仮想フォルダーとして表示されます。 ルート フォルダーとそのすべてのサブフォルダーとデータ項目がシェル名前空間の一部になり、Windows エクスプローラーがユーザー インターフェイスになります。 そのため、カスタム アプリケーションに必要な UI プログラミングよりもはるかに少ない UI プログラミングを使用して、使い慣れた簡単にアクセスできる方法でユーザーに情報を提示できます。

名前空間拡張機能は、次の 2 つの基本的なコンポーネントで構成されます。

  • データ マネージャー
  • データ マネージャーと Windows エクスプローラー間のインターフェイス

リストの最初のコンポーネントは完全にあなた次第です。 最も効果的な方法でデータを格納および管理できます。 2 番目のコンポーネントは、データをフォルダー オブジェクトとしてパッケージ化し、Windows エクスプローラーとの対話を処理するために必要なコードです。 Windows エクスプローラーは、これらのオブジェクトを呼び出して、ユーザーがフォルダーとファイルのコレクションであるかのようにデータを表示および操作できるようにします。 名前空間拡張機能のフォルダー オブジェクトは、通常のフォルダーであるかのように Windows エクスプローラーと対話する必要があります。 名前空間拡張機能を実装する前に、まず Windows エクスプローラーがフォルダー オブジェクトを処理する方法を理解しておく必要があります。

既定のシステム フォルダー ビュー オブジェクト (DefView)

シェルは、独自の名前空間拡張機能を実装する作業の多くを回避できるように、フォルダー ビューの既定の実装を提供します。これは DefView と呼ばれます。 一部のビュー機能はカスタム ビューでは実現できないため、多くの場合、カスタム ビューの代わりに既定のシステム フォルダー ビュー オブジェクトを使用することをお勧めします。 詳細については、「 SHCreateShellFolderView」を参照してください。

Windows エクスプローラーが名前空間拡張機能と対話する方法

Windows エクスプローラー は、ユーザーが次のようなさまざまなタスクを実行できる GUI を提供します。

  • 名前空間階層を移動し、フォルダーの内容を表示します。
  • オブジェクトの移動、削除、コピーによる名前空間の内容の管理
  • オブジェクトに関するさまざまな情報を取得する。
  • アプリケーションの起動

Windows エクスプローラー GUI には、5 つの基本的なコンポーネントがあります。 次の図は、コンポーネントに名前を付け、Windows エクスプローラー内で通常表示される場所を示しています。

エクスプローラーのユーザー インターフェイスのコンポーネントを示す図

ユーザーが Windows エクスプローラー の名前空間拡張機能に属するフォルダーを表示すると、フォルダー オブジェクトは少なくとも 5 つの領域の内容を部分的に制御できます。

ツリー ビュー

ツリー ビューには、名前空間の概要が表示されます。 この領域は、名前空間階層内のすべての名前空間フォルダーとフォルダーの位置を表示できる ツリー ビュー コントロール をホストします。 ユーザーは、ツリー ビュー領域で次のようないくつかの操作を実行できます。

  • 名前空間の次のレベルを表示または非表示にする。
  • フォルダーのコピー、移動、または削除。
  • フォルダーを右クリックしてショートカット メニューを表示します。
  • フォルダーを選択し、その内容をフォルダー ビューで表示する。

ツリー ビューは、主に IShellFolder インターフェイスを介してフォルダー オブジェクトと通信します。 たとえば、ユーザーがフォルダーのアイコンの横にあるプラス記号 (+) をクリックすると、Windows エクスプローラーは表示を展開してフォルダーのサブフォルダーを表示します。 ツリー ビューを更新するために必要な情報を取得するために、シェルはフォルダー オブジェクトの IShellFolder インターフェイスに対して次のような呼び出しを行います。

  • フォルダーの属性を要求します。
  • フォルダーの内容を列挙します。
  • 各サブフォルダーの表示名を要求します。
  • 各フォルダーの横に表示するアイコンを要求します。

次に、Windows エクスプローラーツリー ビューを更新して、選択したフォルダーのサブフォルダーを表示します。 サブフォルダーにサブフォルダーがある場合は、フォルダー アイコンの横に '+' 文字が表示されます。 ユーザーがツリー ビューで実行できるより高度なタスクは、次のとおりです。

  • クリップボードを使用してフォルダーを切り取るかコピーし、別のフォルダーに貼り付けます。
  • ドラッグ アンド ドロップを使用してフォルダーを切り取りまたはコピーし、別のフォルダーにドロップします。
  • 検索エンジンを使用してフォルダーまたはそのサブフォルダー内のアイテムを検索する。
  • フォルダーのプロパティの変更。

名前空間拡張機能がこれらのユーザー アクションを処理する方法の詳細については、「 基本的なフォルダー オブジェクト インターフェイスの実装」を参照してください。

フォルダー ビュー

ユーザーがフォルダーを選択すると、フォルダー ビューにフォルダーの内容が表示されます。 ある程度、フォルダー ビューの通常の機能はツリー ビューと重複しています。 ユーザーは、フォルダーの移動またはコピー、フォルダーのプロパティの変更、サブフォルダーの内容の表示、フォルダーのショートカット メニューの表示などを行うことができます。 ただし、ツリー ビューとフォルダー ビューには、いくつかの異なる違いがあります。

  • フォルダー ビューには、名前空間階層の一部または全部ではなく、1 つのフォルダーの内容のみが表示されます。
  • フォルダー ビューには、ファイル オブジェクトとフォルダー オブジェクトが表示されます。
  • フォルダー ビューには、ツリー ビューよりもはるかに多くのオブジェクトに関する情報が表示されます。
  • フォルダー ビューを使用すると、名前空間の拡張機能は、表示される情報とその方法をほぼ完全に制御できます。 フォルダー アイコンなど、ツリー ビューの小さな側面のみを変更できます。

ツリー ビューとは異なり、Windows エクスプローラーはフォルダー ビューの内容を直接制御しません。 フォルダー ビューは、Windows エクスプローラーがフォルダー オブジェクトに提供する領域です。 フォルダー ビューでのフォルダーの内容の表示と管理は、フォルダー オブジェクトの役割です。 ほとんどのフォルダー ビューはかなり標準的な形式に従いますが、表示できる内容や方法に関する制限はほとんどありません。 極端なケースは、フル機能を備えたブラウザーであるインターネット フォルダーです。

ユーザーが名前空間拡張機能に属するフォルダーを選択すると、ウィンドウを作成し、そのハンドルを Windows エクスプローラーに渡します。 このウィンドウは、フォルダー ビュー ウィンドウの子になります。 Windows エクスプローラーはフォルダー ビュー ウィンドウのサイズを提供しますが、子ウィンドウの内容に制限はありません。 その後、子ウィンドウを使用して、フォルダーのフォルダー ビューを表示できます。

名前空間拡張機能では、フォルダー ビューを作成するために次の 2 つの方法のいずれかを使用します。

  • 子ウィンドウを使用して 、リスト ビュー コントロールをホストします。 このコントロールを使用すると、Windows エクスプローラークラシック ビューとほぼ同じ方法でフォルダーの内容を表示できます。
  • 子ウィンドウを使用して WebBrowser コントロール をホストし、動的 HTML (DHTML) ドキュメントを使用してフォルダーの内容を表示します。

どちらの方法でも、システム フォルダーに対して表示されるのとよく似たフォルダー ビューが表示されます。 ただし、別の表示スキームを使用する場合は、自由に使用できます。

ほとんどの Windows アプリケーションと同様に、Windows エクスプローラーはユーザーにツールのコレクションを提供します。 メニュー バーから、ツールの完全な選択を行うことができます。 より一般的に使用されるツールは、ツール バーのボタンまたは編集ボックスでも表されます。 多くの Windows アプリケーションとは異なり、Windows エクスプローラー メニュー バーは、実際には、従来のメニューのように動作するようにカスタマイズされたツール バー コントロールです。 メニュー バーとツール バーの両方が Rebar コントロール に組み込まれており、ユーザーはニーズに合わせて個々のコントロールを整理できます。

既定では、Windows エクスプローラーでは、ボタンとメニュー項目の標準セット (コピーやプロパティなど) がサポートされています。 名前空間拡張機能では、標準ツールを削除し、カスタム ツールを追加することで、メニュー バーとツール バーをカスタマイズできます。 フォルダー ビュー オブジェクトが初期化されると、Windows エクスプローラーは IShellBrowser インターフェイスへのポインターを渡します。 このインターフェイスでは、メニュー バーとツール バーをカスタマイズするために呼び出すことができるいくつかのメソッドがサポートされています。 ユーザーがカスタム メニュー項目またはツール バー ボタンのいずれかを選択すると、Windows エクスプローラーは、カスタム メニューおよびツール バー項目のメッセージWM_COMMAND子ウィンドウのウィンドウ プロシージャに転送します。

ステータス バー

Windows エクスプローラーステータス バーには、現在選択されているオブジェクトに関する情報が表示されます。 名前空間拡張機能では、ステータス バーを使用して、テキスト文字列などの状態情報を表示できます。 ステータス バーをカスタマイズするには、 IShellBrowser を呼び出します。