Compartilhar via


Habilitando notificações

O Windows Media Gerenciador de Dispositivos declara quatro interfaces que um aplicativo pode implementar em uma classe COM para receber notificações de evento. Essas interfaces se enquadram em dois grupos, conforme mostrado na tabela a seguir.

Interfaces Descrição
IWMDMNotification Notifica o aplicativo quando dispositivos ou mídia de armazenamento estão conectados ou desconectados.
IWMDMProgress
IWMDMProgress2
IWMDMProgress3
Um sistema de notificação muito simples para alertar um aplicativo sobre o progresso de qualquer evento. O aplicativo não é necessário para executar nenhuma ação em resposta a essas mensagens.

IWMDMNotification

IWMDMNotification alerta o aplicativo quando Plug and Play dispositivos são conectados ou desconectados do computador, bem como quando Plug and Play mídia de armazenamento (como cartões flash) são inseridos ou removidos do dispositivo. Essas notificações podem ajudar o aplicativo a atualizar sua interface do usuário para refletir as alterações.

Para receber essas notificações, seu aplicativo deve se registrar para recebê-las usando as interfaces IConnectionPointContainer e IConnectionPoint do SDK da Plataforma. Seu aplicativo deve se registrar para receber eventos quando ele for iniciado e cancelar o registro quando ele for fechado. Siga estas etapas para se registrar para receber essas notificações.

  1. Consulte a interface IWMDeviceManager main que você recebeu ao autenticar seu aplicativo para IConnectionPointContainer.
  2. Chame IConnectionPointContainer::FindConnectionPoint para recuperar um ponto de conexão de contêiner para interfaces IWMDMNotification .
  3. Registre-se para receber eventos chamando IConnectionPoint::Advise. Passe a classe que implementa IWMDMNotification e recupere um cookie, uma ID exclusiva que identifica o ponto de conexão. Isso deve ser armazenado e usado posteriormente para cancelar o registro de notificações de evento.

O código C++ a seguir demonstra como você pode se registrar para receber notificações de 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;
}

Quando o aplicativo for fechado, você deverá cancelar o registro com o IConnectionPoint para indicar que ele não deve mais enviar notificações. Siga estas etapas para cancelar o registro de notificações:

  1. Consulte a interface IWMDeviceManager main para IConnectionPointContainer.
  2. Obtenha um ponto de conexão para interfaces IWMDMNotification .
  3. Cancele o registro do aplicativo para notificações de evento chamando IConnectionPoint::Unadvise, passando a ID exclusiva recebida quando você se registrou para receber eventos.

O código C++ a seguir mostra como cancelar o registro de eventos IWMDMNotification quando o aplicativo for fechado.

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;
}

Usando IWMDMProgress

O Windows Media Gerenciador de Dispositivos pode enviar mensagens status seu aplicativo quando ações específicas, como transferência de conteúdo, aquisição de relógio seguro e encontro de informações de arquivo DRM, ocorrem. Seu aplicativo pode usar essas mensagens para monitorar a status do evento ou cancelar um evento. Para usar essa interface, implemente IWMDMProgress, IWMDMProgress2 ou IWMDMProgress3 e passe-o como um parâmetro para um método que aceitará uma mensagem de progresso. Observe que IWMDMProgress3 é a interface superior porque fornece um GUID de identificação que especifica qual ação está sendo controlada. Os seguintes métodos de aplicativo aceitam uma interface de progresso (os métodos do provedor de serviços correspondentes devem ser capazes de enviar notificações para uma interface enviada):

IWMDMStorageControl::D elete

IWMDMStorageControl::Insert

IWMDMStorageControl::Move

IWMDMStorageControl::Read

IWMDMStorageControl::Rename

IWMDMStorageControl2::Insert2

IWMDMStorageControl3::Insert3

IWMDMStorageGlobals::Initialize

IWMDRMDeviceApp::AcquireDeviceData

Exemplos de passar uma interface para um método são dados na documentação desses métodos. Para obter exemplos de implementação das interfaces de retorno de chamada, consulte a documentação para os métodos de IWMDMProgress, IWMDMProgress2 ou IWMDMProgress3.

Criando um aplicativo de Gerenciador de Dispositivos do Windows Media