Compartilhar via


Manipulando eventos em C++

[O recurso associado a esta página, Reprodutor Multimídia do Windows SDK, é um recurso herdado. Foi substituído pelo MediaPlayer. O MediaPlayer foi otimizado para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o MediaPlayer em vez de Reprodutor Multimídia do Windows SDK, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Você pode receber eventos de Reprodutor Multimídia do Windows de duas maneiras.

  • Por meio de IDispatch usando a interface _WMPOCXEvents . Essa é a interface a ser usada para a maioria dos cenários de inserção.
  • Por meio da interface IWMPEvents . Essa interface está disponível quando o código está conectado ao player de modo completo, como ao fazer a comunicação remota do controle Reprodutor Multimídia do Windows ou em um plug-in de interface do usuário.

Em cada cenário, você começa a ouvir eventos usando pontos de conexão COM.

O código de exemplo a seguir usa três variáveis de membro:

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

Para recuperar um ponto de conexão, primeiro você consultaInterface para o contêiner do ponto de conexão.

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

hr = m_spWMPPlayer->QueryInterface(&spConnectionContainer);

Em seguida, solicite o ponto de conexão para a interface de evento que você deseja usar. O código de exemplo a seguir primeiro tenta usar IWMPEvents. Se essa interface não estiver disponível, ela usará _WMPOCXEvents.

// 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);
    }
}

Por fim, chame IConnectionPoint::Advise para solicitar eventos.

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

No exemplo anterior, o primeiro parâmetro pressupõe que a classe de chamada implementa IWMPEvents e _WMPOCXEvents. O segundo parâmetro é um valor retornado que você usa para parar de ouvir eventos, como quando o programa é encerrado, usando um código semelhante ao seguinte:

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

A implementação dos manipuladores de eventos para IWMPEvents e _WMPOCXEvents é diferente. Para IWMPEvents, você deve implementar uma função para manipular todos os eventos definidos pela interface, mesmo que não pretenda usar o evento.

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

Para implementar manipuladores de _WMPOCXEvents , você deve usar IDispatch::Invoke, que é uma implementação de manipulador de eventos único para todos os eventos que ocorrem na interface IDispatch . Isso significa que você pode optar por manipular apenas determinados eventos e ignorar outros. O código de exemplo a seguir mostra um manipulador de _WMPOCXEvents , usando Invoke, que manipula apenas os eventos OpenStateChange e PlayStateChange :

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 );
}

No código de exemplo anterior, cada caso simplesmente chama o manipulador IWMPEvents para o evento correspondente. Se o código manipular apenas _WMPOCXEvents, você poderá simplesmente chamar uma função personalizada ou manipular o evento embutido após a instrução case .

Recebendo eventos do Reprodutor Multimídia do Windows 10 Mobile

O controle Reprodutor Multimídia do Windows 10 Mobile dá suporte apenas ao recebimento de determinados eventos por meio de _WMPOCXEvents e IWMPEvents. Para obter mais informações, consulte a documentação de IWMPEvents.

Exemplos

O pacote de instalação do Reprodutor Multimídia do Windows instala um exemplo que demonstra a manipulação de eventos. Consulte o exemplo WMPHost para obter mais informações.

Exemplos

Usando o controle Reprodutor Multimídia do Windows em um programa C++