Share via


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