共用方式為


啟用通知

Windows Media 裝置管理員宣告應用程式可以在 COM 類別中實作的四個介面,以接收事件通知。 這些介面分成兩個群組,如下表所示。

介面 描述
IWMDMNotification 在裝置或存放裝置媒體連線或中斷連線時通知應用程式。
IWMDMProgress
IWMDMProgress2
IWMDMProgress3
一個非常簡單的通知系統,可警示應用程式是否有任何事件的進度。 應用程式不需要採取任何動作來回應這些訊息。

IWMDMNotification

IWMDMNotification會在隨插即用裝置與電腦連線或中斷連線時,以及從裝置插入或移除隨插即用儲存媒體 (例如快閃卡) 時,警示應用程式。 這些通知可協助應用程式更新其使用者介面以反映變更。

若要接收這些通知,您的應用程式必須註冊,才能使用 Platform SDK IConnectionPointContainerIConnectionPoint 介面來接收這些通知。 您的應用程式應該在啟動時註冊以接收事件,並在關閉時取消註冊。 請遵循下列步驟來註冊以接收這些通知。

  1. 查詢您在驗證IConnectionPointContainer的應用程式時收到的主要IWMDeviceManager介面。
  2. 呼叫 IConnectionPointContainer::FindConnectionPoint 以擷取 IWMDMNotification 介面的容器連接點。
  3. 呼叫 IConnectionPoint::建議來註冊以接收事件。 傳入實作 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 取消註冊,以指出它不應該再傳送通知。 請遵循下列步驟來取消註冊通知:

  1. 查詢IConnectionPointContainer的主要IWMDeviceManager介面。
  2. 取得 IWMDMNotification 介面的連接點。
  3. 呼叫 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 檔案資訊。 您的應用程式可以使用這些訊息來監視事件的狀態或取消事件。 若要使用此介面,請實作 IWMDMProgressIWMDMProgress2IWMDMProgress3,並將它當做參數傳入將接受進度訊息的方法。 請注意 ,IWMDMProgress3 是上層介面,因為它會提供識別 GUID 來指定正在追蹤的動作。 下列應用程式方法接受進度介面, (對應的服務提供者方法應該能夠將通知傳送至提交的介面) :

IWMDMStorageControl::D elete

IWMDMStorageControl::Insert

IWMDMStorageControl::Move

IWMDMStorageControl::Read

IWMDMStorageControl::Rename

IWMDMStorageControl2::Insert2

IWMDMStorageControl3::Insert3

IWMDMStorageGlobals::Initialize

IWMDRMDeviceApp::AcquireDeviceData

將這些方法的檔提供將介面傳遞至方法的範例。 如需實作回呼介面的範例,請參閱IWMDMProgressIWMDMProgress2 或 IWMDMProgress3方法的檔。

建立 Windows Media 裝置管理員 應用程式