다음을 통해 공유


IMFSensorActivityMonitor 인터페이스(mfidl.h)

센서 활동 모니터를 제어하는 방법을 제공합니다.

상속

IMFSensorActivityMonitor 인터페이스는 IUnknown 인터페이스에서 상속됩니다. IMFSensorActivityMonitor 에는 다음과 같은 유형의 멤버도 있습니다.

메서드

IMFSensorActivityMonitor 인터페이스에는 이러한 메서드가 있습니다.

 
IMFSensorActivityMonitor::Start

센서 활동 모니터를 시작합니다.
IMFSensorActivityMonitor::Stop

센서 활동 모니터를 중지합니다.

설명

MFCreateSensorActivityMonitor를 호출하여 이 클래스의 instance 가져옵니다. 센서 활동 보고서는 이 메서드에 전달된 IMFSensorActivitiesReportCallback 인터페이스를 통해 전달됩니다.

예제

아래 예제는 C++/WinRT를 사용하여 COM 콜백 클래스WIL(Windows 구현 라이브러리)을 작성하는 것입니다.

전체 샘플 Visual Studio 프로젝트는 Windows-Camera GitHub 리포지토리에서 찾을 수 있습니다.

다음 예제에서는 IMFSensorActivitiesReportCallback을 구현하는 클래스 선언을 보여 줍니다.

class MyCameraNotificationCallback : public winrt::implements <MyCameraNotificationCallback, IMFSensorActivitiesReportCallback>
{
public:
    
    static HRESULT CreateInstance(_In_z_ LPCWSTR symbolicName, _COM_Outptr_ MyCameraNotificationCallback** value) noexcept;

    // IMFSensorActivitiesReportCallback
    IFACEMETHODIMP OnActivitiesReport(_In_ IMFSensorActivitiesReport* sensorActivitiesReport) override;

    bool IsInUse();

private:

    HRESULT Initialize(_In_z_ LPCWSTR symbolicName);

    WCHAR   _symbolicName[MAX_PATH] = {};
    bool    _inUse = false;
    wil::slim_event  _event;
};

다음 예제에서는 OnActivitiesReport 콜백의 구현을 보여 줍니다.

OnActivitiesReport 함수는 쿼리된 센서 디바이스가 현재 사용 중인지 여부를 나타내기 위해 부울 클래스 멤버를 업데이트한 다음 상태 획득했음을 알리는 이벤트를 설정합니다.

콜백은 여러 번 호출할 수 있으며 보고서를 포함하지 않을 수 있으므로 보고서가 발견된 경우에만 이벤트가 설정됩니다.


IFACEMETHODIMP MyCameraNotificationCallback::OnActivitiesReport(_In_ IMFSensorActivitiesReport* sensorActivitiesReport)
{
    bool inUse = false;
    wil::com_ptr_nothrow<IMFSensorActivityReport> sensorActivity;
    ULONG cProcCount = 0;

    printf("\nGetActivityReportByDeviceName [%ws] \n", _symbolicName);
    RETURN_IF_FAILED_WITH_EXPECTED(sensorActivitiesReport->GetActivityReportByDeviceName(_symbolicName, &sensorActivity),MF_E_NOT_FOUND);

    RETURN_IF_FAILED(sensorActivity->GetProcessCount(&cProcCount));
    for (ULONG i = 0; i < cProcCount; i++)
    {
        BOOL fStreaming = FALSE;
        wil::com_ptr_nothrow<IMFSensorProcessActivity> processActivity;

        RETURN_IF_FAILED(sensorActivity->GetProcessActivity(i, &processActivity));
        RETURN_IF_FAILED(PrintProcessActivity(processActivity.get()));
        
        RETURN_IF_FAILED(processActivity->GetStreamingState(&fStreaming));

        if (fStreaming)
        {
            inUse = true;
            break;
        }
    }

    // Set flag that the device is in use and then signal event
    _inUse = inUse;
    if (cProcCount > 0)
    {
        _event.SetEvent();
    }

    return S_OK;
}

이 예제에서는 OnActivitiesReport 콜백에서 이벤트가 신호를 받을 때까지 기다리는 클래스 메서드를 보여 줍니다. OnActivitiesReport는 활동에서 찾을 때만 SetEvent이므로 WaitForSingleObject에 적절한 시간 제한 값을 사용하려고 하므로 이 예제에서는 500ms를 사용하며 시간 제한 사례는 "카메라 사용 안 함"으로 변환됩니다.

bool MyCameraNotificationCallback::IsInUse( )
{
    if (_event.wait(500))
    {
        return _inUse;
    }

    return false;
}

다음 예제에서는 MFCreateSensorActivityMonitor 를 호출하여 활동 모니터를 만든 다음, 위에 표시된 IsInUse 클래스 메서드를 호출하여 지정된 센서가 현재 사용 중인지 확인하는 구현을 보여 줍니다.

HRESULT IsCameraInUse(
    _In_z_ LPCWSTR symbolicName,
    bool& inUse
)
{
    wil::com_ptr_nothrow<MyCameraNotificationCallback> cameraNotificationCallback;
    wil::com_ptr_nothrow<IMFSensorActivityMonitor> activityMonitor;
    wil::com_ptr_nothrow<IMFShutdown> spShutdown;

    RETURN_IF_FAILED(MyCameraNotificationCallback::CreateInstance(symbolicName, &cameraNotificationCallback));

    // Create the IMFSensorActivityMonitor, passing in the IMFSensorActivitiesReportCallback.
    RETURN_IF_FAILED(MFCreateSensorActivityMonitor(cameraNotificationCallback.get(), &activityMonitor));

    // Start the monitor
    RETURN_IF_FAILED(activityMonitor->Start());

    // Call the method that checks to if the monitored device is in use.
    inUse = cameraNotificationCallback->IsInUse();

    // Stop the activity monitor.
    RETURN_IF_FAILED(activityMonitor->Stop());

    // Shutdown the monitor.
    RETURN_IF_FAILED(activityMonitor.query_to(&spShutdown));

    RETURN_IF_FAILED(spShutdown->Shutdown());

    return S_OK;
}

요구 사항

   
지원되는 최소 클라이언트 Windows 10, 버전 1703 [데스크톱 앱만 해당]
지원되는 최소 서버 지원되는 버전 없음
대상 플랫폼 Windows
헤더 mfidl.h