啟用通知
Windows Media 裝置管理員宣告應用程式可以在 COM 類別中實作的四個介面,以接收事件通知。 這些介面分成兩個群組,如下表所示。
介面 | 描述 |
---|---|
IWMDMNotification | 在裝置或存放裝置媒體連線或中斷連線時通知應用程式。 |
IWMDMProgress IWMDMProgress2 IWMDMProgress3 |
一個非常簡單的通知系統,可警示應用程式是否有任何事件的進度。 應用程式不需要採取任何動作來回應這些訊息。 |
IWMDMNotification
IWMDMNotification會在隨插即用裝置與電腦連線或中斷連線時,以及從裝置插入或移除隨插即用儲存媒體 (例如快閃卡) 時,警示應用程式。 這些通知可協助應用程式更新其使用者介面以反映變更。
若要接收這些通知,您的應用程式必須註冊,才能使用 Platform SDK IConnectionPointContainer 和 IConnectionPoint 介面來接收這些通知。 您的應用程式應該在啟動時註冊以接收事件,並在關閉時取消註冊。 請遵循下列步驟來註冊以接收這些通知。
- 查詢您在驗證IConnectionPointContainer的應用程式時收到的主要IWMDeviceManager介面。
- 呼叫 IConnectionPointContainer::FindConnectionPoint 以擷取 IWMDMNotification 介面的容器連接點。
- 呼叫 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 取消註冊,以指出它不應該再傳送通知。 請遵循下列步驟來取消註冊通知:
- 查詢IConnectionPointContainer的主要IWMDeviceManager介面。
- 取得 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方法的檔。