アクティブ デスクトップ オブジェクトの使用

[この機能は、Windows XP 以前でのみサポートされています。 ]

この記事には、Windows シェル API の一部である ActiveDesktop オブジェクトに関する情報が含まれています。 このオブジェクトは、 IActiveDesktop インターフェイスを介して、デスクトップ上の項目を追加、削除、および変更できます。

Active Desktop インターフェイスの概要

Active Desktop は、Microsoft Internet エクスプローラー 4.0 で導入された機能で、HTML ドキュメントとアイテム (Microsoft ActiveX Controls や Java アプレットなど) をデスクトップに直接含めることができます。 Windows シェル API の一部である IActiveDesktop インターフェイスは、デスクトップ上の項目をプログラムで追加、削除、変更するために使用されます。 アクティブなデスクトップ項目は、チャネル定義形式 (CDF) ファイルを使用して追加することもできます。

アクティブ デスクトップへのアクセス

Active Desktop にアクセスするには、クライアント アプリケーションで 、CoCreateInstance 関数を使用して ActiveDesktop オブジェクト (CLSID_ActiveDesktop) のインスタンスを作成し、オブジェクトの IActiveDesktop インターフェイスへのポインターを取得する必要があります。

次の例は、 IActiveDesktop インターフェイスへのポインターを取得する方法を示しています。

HRESULT hr;
IActiveDesktop *pActiveDesktop;

//Create an instance of the Active Desktop
hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
                      IID_IActiveDesktop, (void**)&pActiveDesktop);

//Insert code to call the IActiveDesktop methods

// Call the Release method
pActiveDesktop->Release();

デスクトップ項目の追加

デスクトップアイテムの追加に使用できるメソッドは、 IActiveDesktop::AddDesktopItemIActiveDesktop::AddDesktopItemWithUIIActiveDesktop::AddUrl の 3 種類です。 Active Desktop に追加される各デスクトップ項目には、異なるソース URL が必要です。

IActiveDesktop::AddDesktopItemWithUI メソッドと IActiveDesktop::AddUrl メソッドはどちらも、デスクトップ項目を Active Desktop に追加する前に表示できるさまざまなユーザー インターフェイスを表示するオプションを提供します。 インターフェイスは、ユーザーがデスクトップ項目を Active Desktop に追加するかどうかを確認します。 また、インターフェイスは、URL セキュリティ ゾーン設定によって保証されるセキュリティ リスクをユーザーに通知し、このデスクトップ アイテムのサブスクリプションを作成するかどうかをユーザーに尋ねます。 どちらの方法でも、ユーザー インターフェイスを抑制する方法が提供されます。 IActiveDesktop::AddDesktopItem メソッドでは、レジストリを更新するために IActiveDesktop::ApplyChanges を呼び出す必要があります。 IActiveDesktop::AddDesktopItemWithUI の場合、クライアント アプリケーションは IActiveDesktop インターフェイスを直ちに解放してから、CoCreateInstance 関数を使用して、新しく追加されたデスクトップ項目を含む ActiveDesktop オブジェクトのインスタンスへのインターフェイスを取得する必要があります。

IActiveDesktop::AddDesktopItem メソッドは、URL セキュリティ ゾーンの設定で禁止されていない限り、ユーザー インターフェイスなしで指定されたデスクトップ項目を Active Desktop に追加します。 URL セキュリティ ゾーンの設定で、ユーザーにメッセージを表示せずにデスクトップ項目を追加できない場合、メソッドは失敗します。 IActiveDesktop::AddDesktopItem では、レジストリを更新するために IActiveDesktop::ApplyChanges の呼び出しも必要です。

次の例では、 IActiveDesktop::AddDesktopItem メソッドを使用してデスクトップ項目を追加する方法を示します。

HRESULT hr;
IActiveDesktop *pActiveDesktop;
COMPONENT compDesktopItem;

//Create an instance of the Active Desktop
hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
                      IID_IActiveDesktop, (void**)&pActiveDesktop);

// Initialize the COMPONENT structure
compDesktopItem.dwSize = sizeof(COMPONENT);

// Insert code that adds the information about the desktop item 
// to the COMPONENT structure

// Add the desktop item
pActiveDesktop->AddDesktopItem(&compDesktopItem,0);

// Save the changes to the registry
pActiveDesktop->ApplyChanges(AD_APPLY_ALL);

デスクトップ項目の列挙

現在 Active Desktop にインストールされているデスクトップアイテムを列挙するには、クライアント アプリケーションで IActiveDesktop::GetDesktopItemCount メソッドを使用してインストールされたデスクトップ項目の合計数を取得し、デスクトップアイテムインデックスを使用して IActiveDesktop::GetDesktopItem メソッドを呼び出して各デスクトップアイテムの COMPONENT 構造を取得するループを作成する必要があります。

次の例では、デスクトップ項目を列挙する 1 つの方法を示します。

HRESULT hr;
IActiveDesktop *pActiveDesktop;
COMPONENT compDesktopItem;
int intCount;
int intIndex = 0;

//Create an instance of the Active Desktop
hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
                      IID_IActiveDesktop, (void**)&pActiveDesktop);

pActiveDesktop->GetDesktopItemCount(&intCount,0);

compDesktopItem.dwSize = sizeof(COMPONENT);

while(intIndex<=(intCount-1))
{
    //get the COMPONENT structure for the current desktop item
    pActiveDesktop->GetDesktopItem(intIndex, &compDesktopItem,0);

    //Insert code that processes the structure

    //Increment the index
    intIndex++;

    //Insert code to clean-up structure for next component
}

// Call the Release method
pActiveDesktop->Release();