Recuperando eventos

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, 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.]

O Gerenciador de Grafo de Filtro expõe três interfaces que dão suporte à notificação de eventos.

Filtra as notificações pós-evento chamando o método IMediaEventSink::Notify no Gerenciador do Gráfico de Filtros. Uma notificação de evento consiste em um código de evento, que define o tipo de evento e dois parâmetros que fornecem informações adicionais. Dependendo do código do evento, os parâmetros podem conter ponteiros, códigos de retorno, tempos de referência ou outras informações. Para obter uma lista completa de códigos de evento e parâmetros, consulte Códigos de notificação de eventos.

Para recuperar um evento da fila, o aplicativo chama o método IMediaEvent::GetEvent no Gerenciador do Gráfico de Filtros. Esse método é bloqueado até que haja um evento a ser retornado ou até que um tempo especificado se despira. Supondo que haja um evento na fila, o método retorna com o código de evento e os dois parâmetros de evento. Depois de chamar GetEvent, um aplicativo sempre deve chamar o método IMediaEvent::FreeEventParams para liberar todos os recursos associados aos parâmetros de evento. Por exemplo, um parâmetro pode ser um valor BSTR que foi alocado pelo grafo de filtro.

O exemplo de código a seguir fornece uma estrutura de tópicos de como recuperar eventos da fila.

long evCode;
LONG_PTR param1, param2;
HRESULT hr;
while (hr = pEvent->GetEvent(&evCode, &param1, &param2, 0), SUCCEEDED(hr))
{
    switch(evCode) 
    { 
        // Call application-defined functions for each 
        // type of event that you want to handle.
    } 
    hr = pEvent->FreeEventParams(evCode, param1, param2);
}

Para substituir o tratamento padrão do Gerenciador de Gráficos de Filtro para um evento, chame o método IMediaEvent::CancelDefaultHandling com o código de evento como um parâmetro. Você pode restabelecer o tratamento padrão chamando o método IMediaEvent::RestoreDefaultHandling . Se o grafo de filtro não executar nenhum tratamento padrão para o código de evento especificado, chamar esses métodos não terá efeito.

Notificação de eventos no DirectShow