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 只會在找到活動時 SetEvent,我們想要對 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