Использование объекта Active Desktop
[Эта функция поддерживается только в Windows XP или более ранней версии. ]
В этой статье содержатся сведения о объекте ActiveDesktop, который является частью API оболочки Windows. Этот объект с помощью интерфейса IActiveDesktop позволяет добавлять, удалять и изменять элементы на рабочем столе.
Общие сведения об интерфейсе Active Desktop
Active Desktop — это функция, представленная в Microsoft Internet Explorer 4.0, которая позволяет включать HTML-документы и элементы (например, элементы Microsoft ActiveX и приложения Java) непосредственно на рабочий стол. Интерфейс IActiveDesktop, который является частью API оболочки Windows, используется для программного добавления, удаления и изменения элементов на рабочем столе. Элементы Active Desktop также можно добавить с помощью файла формата определения канала (CDF).
Доступ к активному рабочему столу
Чтобы получить доступ к Active Desktop, клиентскому приложению потребуется создать экземпляр объекта ActiveDesktop (CLSID_ActiveDesktop) с помощью функции CoCreateInstance и получить указатель на интерфейс 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::AddDesktopItem, IActiveDesktop::AddDesktopItemWithUIи IActiveDesktop::AddUrl. Каждый элемент рабочего стола, добавленный в Active Desktop, должен иметь другой исходный URL-адрес.
Методы IActiveDesktop::AddDesktopItemWithUI и IActiveDesktop::AddUrl предоставляют возможность отображения различных пользовательских интерфейсов перед добавлением элемента рабочего стола в Active Desktop. Интерфейсы проверяют, хотят ли пользователи добавить элемент рабочего стола в активный рабочий стол. Интерфейсы также уведомляют пользователей о любых рисках безопасности, которые обусловлены настройками зоны безопасности URL, и спрашивают, хотят ли пользователи создать подписку для этого элемента рабочего стола. Оба метода также предоставляют способ подавления пользовательских интерфейсов. Метод IActiveDesktop::AddDesktopItem требует вызова IActiveDesktop::ApplyChanges для обновления реестра. Для IActiveDesktop::AddDesktopItemWithUIклиентское приложение должно немедленно освободить интерфейс IActiveDesktop, а затем использовать функцию CoCreateInstance для получения интерфейса экземпляра объекта ActiveDesktop, который включает добавленный элемент рабочего стола.
Метод IActiveDesktop::AddDesktopItem добавляет указанный элемент рабочего стола в Active Desktop без пользовательского интерфейса, если параметры зоны безопасности URL-адресов не препятствуют этому. Если параметры зоны безопасности 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, а затем создать цикл, который извлекает структуру COMPONENT для каждого элемента рабочего стола, вызвав метод IActiveDesktop::GetDesktopItem с использованием индекса элемента рабочего стола.
В следующем примере показан один из способов перечисления элементов рабочего стола.
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();