Abrufen von Ereignissen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Der Filter Graph-Manager macht drei Schnittstellen verfügbar, die Ereignisbenachrichtigungen unterstützen.

Filtert das Posten von Ereignisbenachrichtigungen, indem die IMediaEventSink::Notify-Methode im Filter Graph-Manager aufgerufen wird. Eine Ereignisbenachrichtigung besteht aus einem Ereigniscode, der den Typ des Ereignisses definiert, und zwei Parametern, die zusätzliche Informationen liefern. Abhängig vom Ereigniscode können die Parameter Zeiger, Rückgabecodes, Verweiszeiten oder andere Informationen enthalten. Eine vollständige Liste der Ereigniscodes und Parameter finden Sie unter Ereignisbenachrichtigungscodes.

Um ein Ereignis aus der Warteschlange abzurufen, ruft die Anwendung die IMediaEvent::GetEvent-Methode im Filter Graph-Manager auf. Diese Methode blockiert, bis ein Ereignis zurückgegeben werden soll oder bis eine angegebene Zeit verstrichen ist. Wenn ein Ereignis in der Warteschlange vorhanden ist, gibt die Methode mit dem Ereigniscode und den beiden Ereignisparametern zurück. Nach dem Aufrufen von GetEvent sollte eine Anwendung immer die IMediaEvent::FreeEventParams-Methode aufrufen, um alle Ressourcen freizugeben, die den Ereignisparametern zugeordnet sind. Ein Parameter kann beispielsweise ein BSTR-Wert sein, der vom Filterdiagramm zugeordnet wurde.

Im folgenden Codebeispiel wird beschrieben, wie Ereignisse aus der Warteschlange abgerufen werden.

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

Um die Standardbehandlung des Filter Graph-Managers für ein Ereignis außer Kraft zu setzen, rufen Sie die IMediaEvent::CancelDefaultHandling-Methode mit dem Ereigniscode als Parameter auf. Sie können die Standardbehandlung wiederherstellen, indem Sie die IMediaEvent::RestoreDefaultHandling-Methode aufrufen. Wenn das Filterdiagramm keine Standardbehandlung für den angegebenen Ereigniscode ausführt, hat das Aufrufen dieser Methoden keine Auswirkungen.

Ereignisbenachrichtigung in DirectShow