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.
Tópicos relacionados
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de