处理 DVD 事件通知
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
当发生某些事件时,DVD 导航器会将通知发送到应用程序指定的窗口,例如当 DVD 域发生更改、遇到新的家长管理级别以及 DVD 导航器即将进入角度块时。 事件参数可以包含与事件相关的其他信息。 错误消息和警告也以这种方式发送。 应用程序指定使用 IMediaEventEx 指针调用 SetNotifyWindow 来处理事件通知的窗口,如下所示:
const DWORD WM_DVD_EVENT = WM_USER + 100;
hr = m_pIME->SetNotifyWindow(reinterpret_cast<OAHWND>(m_hWnd), WM_DVD_EVENT, 0);
在前面的示例中,m_hWnd 是用于接收消息的窗口的 HWND,WM_DVD_EVENT是应用程序定义的消息 (大于 WM_USER) ,表示发生了 DVD 事件。 应用程序通过调用 IMediaEvent::GetEvent 检索事件本身。 由于在任何给定时间,事件队列中可能有多个事件,因此应用程序必须在重复的循环中调用 GetEvent ,直到检索到所有排队事件,如下面的代码示例所示。
while (SUCCEEDED(m_pIME->GetEvent(&lEvent, &lParam1, &lParam2, lTimeOut)))
{
HRESULT hr;
switch (lEvent)
{
case EC_DVD_CURRENT_HMSF_TIME:
{
DVD_HMSF_TIMECODE *pTC = reinterpret_cast<DVD_HMSF_TIMECODE *>(&lParam1);
m_CurTime = *pTC;
...
}
break;
...
} // switch
}
DVD 事件可能包含 lParam1 或 lParam2 参数中的其他信息,如上面所示,当前时间包含在 lParam1 中。 前面的代码示例来自 Dvdcore.cpp 中的 DVD 示例应用程序。 有关所有 DVD 事件及其参数的完整列表,请参阅 DVD 事件通知代码。
相关主题