Behandeln von Ereignissen in C++

Sie können Ereignisse von Windows Media Player auf zwei Arten empfangen.

  • Über IDispatch mithilfe der _ WMPOCXEvents-Schnittstelle. Dies ist die Schnittstelle, die für die meisten Einbettungsszenarien verwendet werden soll.
  • Über die IWMPEvents-Schnittstelle. Diese Schnittstelle ist verfügbar, wenn Ihr Code mit dem Player im voll verfügbaren Modus verbunden ist, z. B. beim Remoting des Windows Media Player-Steuerelements oder in einem Benutzeroberflächen-Plug-In.

In jedem Szenario beginnen Sie mit dem Lauschen auf Ereignisse mithilfe von COM-Verbindungspunkten.

Im folgenden Beispielcode werden drei Membervariablen verwendet:

CComPtr<IWMPPlayer>         m_spWMPPlayer;
CComPtr<IConnectionPoint>   m_spConnectionPoint;
DWORD                       m_dwAdviseCookie;

Um einen Verbindungspunkt abzurufen, rufen Sie zunächst QueryInterface für den Verbindungspunktcontainer ab.

HRESULT  hr = S_OK;
// Smart pointer to IConnectionPointContainer
CComPtr<IConnectionPointContainer>  spConnectionContainer;

hr = m_spWMPPlayer->QueryInterface(&spConnectionContainer);

Fordern Sie als Nächstes den Verbindungspunkt für die Ereignisschnittstelle an, die Sie verwenden möchten. Im folgenden Beispielcode wird zuerst versucht, IWMPEvents zu verwenden. Wenn diese Schnittstelle nicht verfügbar ist, wird _ WMPOCXEvents verwendet.

// Test whether the control supports the IWMPEvents interface.
if(SUCCEEDED(hr))
{
    hr = spConnectionContainer->FindConnectionPoint(__uuidof(IWMPEvents), &m_spConnectionPoint);
    if (FAILED(hr))
    {
        // If not, try the _WMPOCXEvents interface, which uses IDispatch.
        hr = spConnectionContainer->FindConnectionPoint(__uuidof(_WMPOCXEvents), &m_spConnectionPoint);
    }
}

Rufen Sie abschließend IConnectionPoint::Advise auf, um Ereignisse an fordern.

if(SUCCEEDED(hr))
{
    hr = m_spConnectionPoint->Advise(this, &m_dwAdviseCookie);
}

Im vorherigen Beispiel geht der erste Parameter davon aus, dass die aufrufende Klasse sowohl IWMPEvents als auch _ WMPOCXEvents implementiert. Der zweite Parameter ist ein Rückgabewert, den Sie verwenden, um das Lauschen auf Ereignisse zu beenden, z. B. wenn das Programm beendet wird, indem Sie Code ähnlich dem folgenden verwenden:

// Stop listening to events
if (m_spConnectionPoint)
{
    if (0 != m_dwAdviseCookie)
        m_spConnectionPoint->Unadvise(m_dwAdviseCookie);
        m_spConnectionPoint.Release();
}

Die Implementierung der Ereignishandler für IWMPEvents und _ WMPOCXEvents unterscheidet sich. Für IWMPEvents müssen Sie eine Funktion implementieren, um jedes von der -Schnittstelle definierte Ereignis zu behandeln, auch wenn Sie nicht beabsichtigen, das Ereignis zu verwenden.

// IWMPEvents methods
void STDMETHODCALLTYPE OpenStateChange( long NewState ){ return; }
void STDMETHODCALLTYPE PlayStateChange( long NewState ){ return; }
void STDMETHODCALLTYPE AudioLanguageChange( long LangID ){ return; }
// And so on...

Zum Implementieren _ von WMPOCXEvents-Handlern müssen Sie IDispatch::Invoke verwenden. Dies ist eine einzelne Ereignishandlerimplementierung für alle Ereignisse, die in der IDispatch-Schnittstelle stattfinden. Dies bedeutet, dass Sie nur bestimmte Ereignisse behandeln und andere ignorieren können. Der folgende Beispielcode zeigt einen _ WMPOCXEvents-Handler mit Invoke, der nur die OpenStateChange- und PlayStateChange-Ereignisse behandelt:

HRESULT CMyClass::Invoke(
    DISPID  dispIdMember,      
    REFIID  riid,              
    LCID  lcid,                
    WORD  wFlags,              
    DISPPARAMS FAR*  pDispParams,  
    VARIANT FAR*  pVarResult,  
    EXCEPINFO FAR*  pExcepInfo,  
    unsigned int FAR*  puArgErr )
{
    if (!pDispParams)
        return E_POINTER;

    if (pDispParams->cNamedArgs != 0)
        return DISP_E_NONAMEDARGS;

    HRESULT hr = DISP_E_MEMBERNOTFOUND;

    switch (dispIdMember)
    {
        case DISPID_WMPCOREEVENT_OPENSTATECHANGE:
            OpenStateChange(pDispParams->rgvarg[0].lVal /* NewState */ );
            break;

        case DISPID_WMPCOREEVENT_PLAYSTATECHANGE:
            PlayStateChange(pDispParams->rgvarg[0].lVal /* NewState */);
            break;

        // Other cases can handle additional events by using DISPIDs.
    }

    return( hr );
}

Im obigen Beispielcode ruft jeder Fall einfach den IWMPEvents-Handler für das entsprechende Ereignis auf. Wenn Ihr Code nur _ WMPOCXEvents behandelt, können Sie einfach eine benutzerdefinierte Funktion aufrufen oder das Ereignis inline nach der Case-Anweisung behandeln.

Empfangen von Ereignissen von Windows Media Player 10 Mobile

Das Windows Media Player 10 Mobile-Steuerelement unterstützt nur das Empfangen bestimmter Ereignisse über _ WMPOCXEvents und IWMPEvents. Weitere Informationen finden Sie in der Dokumentation zu IWMPEvents.

Beispiele

Das Windows Media Player-Setuppaket installiert ein Beispiel, das die Ereignisbehandlung veranschaulicht. Weitere Informationen finden Sie im WMPHost-Beispiel.

Beispiele

Verwenden des Windows Media Player-Steuerelements in einem C++-Programm