Включение уведомлений
Windows Media диспетчер устройств объявляет четыре интерфейса, которые приложение может реализовать в COM-классе для получения уведомлений о событиях. Эти интерфейсы делятся на две группы, как показано в следующей таблице.
Интерфейсы | Описание |
---|---|
IWMDMNotification | Уведомляет приложение о подключении или отключении устройств или носителей хранилища. |
IWMDMProgress IWMDMProgress2 IWMDMProgress3 |
Очень простая система уведомлений для оповещения приложения о ходе выполнения любого события. Приложению не требуется предпринимать какие-либо действия в ответ на эти сообщения. |
IWMDMNotification
IWMDMNotification оповещает приложение, когда Plug and Play устройства подключены или отключены от компьютера, а также при вставке или удалении с устройства Plug and Play носителей (например, карт флэш-памяти). Эти уведомления могут помочь приложению обновить пользовательский интерфейс для отражения изменений.
Чтобы получать эти уведомления, приложение должно зарегистрироваться для их получения с помощью интерфейсов IConnectionPointContainer и IConnectionPoint sdk для платформы. Приложение должно регистрироваться для получения событий при запуске и отмены регистрации при закрытии. Выполните следующие действия, чтобы зарегистрироваться для получения этих уведомлений.
- Запросите интерфейс main IWMDeviceManager, полученный при проверке подлинности приложения для IConnectionPointContainer.
- Вызовите метод IConnectionPointContainer::FindConnectionPoint , чтобы получить точку подключения контейнера для интерфейсов IWMDMNotification .
- Зарегистрируйтесь для получения событий, вызвав IConnectionPoint::Advise. Передайте класс, реализующий IWMDMNotification, и получите файл cookie, уникальный идентификатор, идентифицирующий точку подключения. Его необходимо сохранить и использовать позже для отмены регистрации уведомлений о событиях.
В следующем коде C++ показано, как зарегистрироваться для получения уведомлений от IWMDMNotification.
HRESULT CWMDMController::RegisterForNotifications()
{
HRESULT hr = S_OK;
CComPtr<IConnectionPointContainer> pConxnPointCont;
CComPtr<IConnectionPoint> pIConnPoint;
// Get the IConnectionPointContainer interface from IWMDeviceManager.
if (SUCCEEDED (hr = m_IWMDMDeviceMgr->QueryInterface(IID_IConnectionPointContainer, (void**) & pConxnPointCont)))
{
// Get a connection point from the container.
if (SUCCEEDED (hr = pConxnPointCont->FindConnectionPoint(IID_IWMDMNotification, &pIConnPoint)))
{
// Add ourselves as a callback handler for the connection point.
// If we succeeded, indicate that by storing the connection point ID.
DWORD dwCookie;
if (SUCCEEDED (hr = pIConnPoint->Advise((IUnknown*)((IWMDMNotification*)this), &dwCookie)))
{
m_dwNotificationCookie = dwCookie;
}
}
}
return hr;
}
После закрытия приложения необходимо отменить регистрацию в IConnectionPoint , чтобы указать, что оно больше не должно отправлять вам уведомления. Чтобы отменить регистрацию уведомлений, выполните следующие действия.
- Запросите интерфейс main IWMDeviceManager для IConnectionPointContainer.
- Получение точки подключения для интерфейсов IWMDMNotification .
- Отмените регистрацию приложения для уведомлений о событиях, вызвав IConnectionPoint::Unadvise, передав уникальный идентификатор, полученный при регистрации для получения событий.
В следующем коде C++ показано, как отменить регистрацию событий IWMDMNotification при закрытии приложения.
HRESULT CWMDMController::UnregisterForNotifications()
{
HRESULT hr = S_FALSE;
// On class initialization, we initialized the handle to -1 as a flag
// to indicate we had not yet registered for notifications. If registration
// never happened, don't bother to unregister.
if (-1 != m_dwNotificationCookie)
{
CComPtr<IConnectionPointContainer> pConxnPointCont;
CComPtr<IConnectionPoint> pIConnPoint;
// Get the connection point container from IWMDeviceManager.
if (SUCCEEDED (hr =
m_IWMDMDeviceMgr->QueryInterface(IID_IConnectionPointContainer,
(void**) & pConxnPointCont)))
{
// Get a connection point from the container.
if (SUCCEEDED (hr = pConxnPointCont->FindConnectionPoint(IID_IWMDMNotification, &pIConnPoint)))
{
// Remove ourselves as a callback from the connection point.
// If successful, reset the ID to a flag value.
if (SUCCEEDED (hr =
pIConnPoint->Unadvise(m_dwNotificationCookie)))
{
m_dwNotificationCookie = -1;
hr = S_OK;
}
}
}
}
return hr;
}
Использование IWMDMProgress
Windows Media диспетчер устройств могут отправлять сообщения о состоянии приложения при выполнении определенных действий, таких как передача содержимого, безопасное получение часов и получение сведений о файле DRM. Приложение может использовать эти сообщения для отслеживания состояния события или отмены события. Чтобы использовать этот интерфейс, реализуйте IWMDMProgress, IWMDMProgress2 или IWMDMProgress3 и передайте его в качестве параметра в метод, который будет принимать сообщение о ходе выполнения. Обратите внимание, что IWMDMProgress3 является превосходным интерфейсом, так как он предоставляет идентификатор GUID, указывающий, какое действие отслеживается. Следующие методы приложения принимают интерфейс хода выполнения (соответствующие методы поставщика услуг должны иметь возможность отправлять уведомления в отправленный интерфейс):
IWMDMStorageGlobals::Initialize
IWMDRMDeviceApp::AcquireDeviceData
Примеры передачи интерфейса в метод приведены в документации по этим методам. Примеры реализации интерфейсов обратного вызова см. в документации по методам IWMDMProgress, IWMDMProgress2 или IWMDMProgress3.