处理 DVD 事件通知

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 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 事件通知代码

DVD 应用程序