Recupero di eventi
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Filter Graph Manager espone tre interfacce che supportano la notifica degli eventi.
- IMediaEventSink contiene il metodo per i filtri per pubblicare eventi.
- IMediaEvent contiene metodi per le applicazioni per recuperare gli eventi.
- IMediaEventEx eredita da ed estende l'interfaccia IMediaEvent .
Filtra le notifiche degli eventi chiamando il metodo IMediaEventSink::Notify in Filter Graph Manager. Una notifica evento è costituita da un codice evento, che definisce il tipo di evento e due parametri che forniscono informazioni aggiuntive. A seconda del codice evento, i parametri potrebbero contenere puntatori, codici restituiti, tempi di riferimento o altre informazioni. Per un elenco completo di codici eventi e parametri, vedere Codici di notifica eventi.
Per recuperare un evento dalla coda, l'applicazione chiama il metodo IMediaEvent::GetEvent in Filter Graph Manager. Questo metodo blocca fino a quando non esiste un evento da restituire o fino a quando non viene trascorso un tempo specificato. Supponendo che esista un evento in coda, il metodo restituisce con il codice evento e i due parametri evento. Dopo aver chiamato GetEvent, un'applicazione deve sempre chiamare il metodo IMediaEvent::FreeEventParams per rilasciare tutte le risorse associate ai parametri dell'evento. Ad esempio, un parametro potrebbe essere un valore BSTR allocato dal grafico del filtro.
Nell'esempio di codice seguente viene illustrato come recuperare gli eventi dalla coda.
long evCode;
LONG_PTR param1, param2;
HRESULT hr;
while (hr = pEvent->GetEvent(&evCode, ¶m1, ¶m2, 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);
}
Per eseguire l'override della gestione predefinita di Filter Graph Manager per un evento, chiamare il metodo IMediaEvent::CancelDefaultHandling con il codice evento come parametro. È possibile ripristinare la gestione predefinita chiamando il metodo IMediaEvent::RestoreDefaultHandling . Se il grafico del filtro non esegue alcuna gestione predefinita per il codice evento specificato, la chiamata di questi metodi non ha alcun effetto.
Argomenti correlati