다음을 통해 공유


이벤트 검색

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

Filter Graph Manager는 이벤트 알림을 지원하는 세 가지 인터페이스를 노출합니다.

  • IMediaEventSink 에는 이벤트를 게시하는 필터에 대한 메서드가 포함되어 있습니다.
  • IMediaEvent 에는 애플리케이션이 이벤트를 검색하는 메서드가 포함되어 있습니다.
  • IMediaEventEx 는 에서 상속되고 IMediaEvent 인터페이스를 확장합니다.

필터 그래프 관리자에서 IMediaEventSink::Notify 메서드를 호출하여 이벤트 알림 게시를 필터링합니다. 이벤트 알림은 이벤트 유형을 정의하는 이벤트 코드와 추가 정보를 제공하는 두 개의 매개 변수로 구성됩니다. 이벤트 코드에 따라 매개 변수에는 포인터, 반환 코드, 참조 시간 또는 기타 정보가 포함될 수 있습니다. 이벤트 코드 및 매개 변수의 전체 목록은 이벤트 알림 코드를 참조하세요.

큐에서 이벤트를 검색하기 위해 애플리케이션은 필터 그래프 관리자에서 IMediaEvent::GetEvent 메서드를 호출합니다. 이 메서드는 반환할 이벤트가 있거나 지정된 시간이 경과할 때까지 차단됩니다. 대기 중인 이벤트가 있다고 가정하면 메서드는 이벤트 코드와 두 이벤트 매개 변수를 사용하여 를 반환합니다. GetEvent를 호출한 후 애플리케이션은 항상 IMediaEvent::FreeEventParams 메서드를 호출하여 이벤트 매개 변수와 연결된 모든 리소스를 해제해야 합니다. 예를 들어 매개 변수는 필터 그래프에 의해 할당된 BSTR 값일 수 있습니다.

다음 코드 예제에서는 큐에서 이벤트를 검색하는 방법에 대한 개요를 제공합니다.

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

이벤트에 대한 Filter Graph Manager의 기본 처리를 재정의하려면 이벤트 코드를 매개 변수로 사용하여 IMediaEvent::CancelDefaultHandling 메서드를 호출합니다. IMediaEvent::RestoreDefaultHandling 메서드를 호출하여 기본 처리를 복원할 수 있습니다. 필터 그래프가 지정된 이벤트 코드에 대한 기본 처리를 수행하지 않는 경우 이러한 메서드를 호출해도 아무런 효과가 없습니다.

DirectShow의 이벤트 알림