Condividi tramite


Abilitazione delle notifiche

Windows Media Device Manager dichiara quattro interfacce che un'applicazione può implementare in una classe COM per ricevere le notifiche degli eventi. Queste interfacce rientrano in due gruppi, come illustrato nella tabella seguente.

Interfacce Descrizione
IWMDMNotification Notifica all'applicazione quando i dispositivi o i supporti di archiviazione sono connessi o disconnessi.
IWMDMProgress
IWMDMProgress2
IWMDMProgress3
Un sistema di notifica molto semplice per avvisare un'applicazione sullo stato di avanzamento di qualsiasi evento. L'applicazione non deve eseguire alcuna azione in risposta a questi messaggi.

IWMDMNotification

IWMDMNotification avvisa l'applicazione quando i dispositivi Plug and Play sono connessi o disconnessi dal computer, nonché quando i supporti di archiviazione Plug and Play (ad esempio le schede flash) vengono inseriti o rimossi dal dispositivo. Queste notifiche consentono all'applicazione di aggiornare l'interfaccia utente per riflettere le modifiche.

Per ricevere queste notifiche, l'applicazione deve registrarsi per riceverle usando l'SDK della piattaforma IConnectionPointContainer e interfacce IConnectionPoint. L'applicazione deve registrarsi per ricevere eventi all'avvio e deregistrarsi alla chiusura. Seguire questa procedura per registrarsi per ricevere queste notifiche.

  1. Esegui una query sull'interfaccia principale IWMDeviceManager, ricevuta quando hai autenticato l'applicazione su IConnectionPointContainer.
  2. Chiamare IConnectionPointContainer::FindConnectionPoint per recuperare un punto di connessione per il contenitore delle interfacce IWMDMNotification.
  3. Eseguire la registrazione per ricevere eventi chiamando IConnectionPoint::Advise. Passate nella classe che implementa IWMDMNotificatione recuperate un cookie, un ID univoco che identifica il punto di connessione. Questa operazione deve essere archiviata e usata in un secondo momento per annullare la registrazione per le notifiche degli eventi.

Il codice C++ seguente illustra come eseguire la registrazione per ricevere notifiche da 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 l'applicazione si chiude, è necessario annullare la registrazione con IConnectionPoint per indicare che non deve più inviare notifiche. Seguire questa procedura per annullare la registrazione per le notifiche:

  1. Eseguire una query sull'interfaccia principale IWMDeviceManager per IConnectionPointContainer.
  2. Ottieni un punto di connessione per le interfacce di IWMDMNotification.
  3. Annullare la registrazione dell'applicazione per le notifiche degli eventi chiamando IConnectionPoint::Unadvise, passando l'ID univoco ricevuto quando si è registrati per ricevere eventi.

Il codice C++ seguente illustra come revocare la registrazione per eventi IWMDMNotification quando l'applicazione viene chiusa.

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

Uso di IWMDMProgress

Gestione dispositivi Windows Media può inviare messaggi di stato dell'applicazione quando si verificano azioni specifiche, ad esempio il trasferimento del contenuto, l'acquisizione sicura dell'orologio e l'individuazione delle informazioni sui file DRM. L'applicazione può usare questi messaggi per monitorare lo stato dell'evento o annullare un evento. Per usare questa interfaccia, implementare IWMDMProgress, IWMDMProgress2o IWMDMProgress3e passarlo come parametro a un metodo che accetterà un messaggio di stato. Si noti che IWMDMProgress3 è l'interfaccia superiore perché fornisce un GUID di identificazione che specifica quale azione viene monitorata. I seguenti metodi dell'applicazione accettano un'interfaccia di avanzamento (i metodi del provider di servizi corrispondenti devono essere in grado di inviare notifiche a un'interfaccia fornita):

IWMDMStorageControl::Elimina

IWMDMStorageControl::Insert

IWMDMStorageControl::Move

IWMDMStorageControl::Read

IWMDMStorageControl::Rename

IWMDMStorageControl2::Insert2

IWMDMStorageControl3::Insert3

IWMDMStorageGlobals::Initialize

IWMDRMDeviceApp::AcquireDeviceData

Nella documentazione di questi metodi sono riportati esempi di passaggio di un'interfaccia in un metodo. Per esempi di implementazione delle interfacce di callback, vedere la documentazione relativa ai metodi di IWMDMProgress, IWMDMProgress2o IWMDMProgress3.

Creazione di un'applicazione Windows Media Device Manager