IMFSensorActivityMonitor 接口 (mfidl.h)

提供用于控制传感器活动监视器的方法。

继承

IMFSensorActivityMonitor 接口继承自 IUnknown 接口。 IMFSensorActivityMonitor 也有以下类型的成员:

方法

IMFSensorActivityMonitor 接口具有这些方法。

 
IMFSensorActivityMonitor::Start

启动传感器活动监视器。
IMFSensorActivityMonitor::Stop

停止传感器活动监视器。

注解

通过调用 MFCreateSensorActivityMonitor 获取此类的实例。 传感器活动报告通过传递到此方法的 IMFSensorActivitiesReportCallback 接口传递。

示例

以下示例使用 C++/WinRT 创作 COM 回调类Windows 实现库 (WIL)

可以从 Windows-Camera GitHub 存储库中找到完整的示例 Visual Studio 项目

以下示例演示实现 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 仅在找到活动时设置事件,因此我们希望对 WaitForSingleObject 使用一些合理的超时值,因此此示例使用 500 毫秒,任何超时情况都将转换为“相机未使用”。

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