Поделиться через


Интерфейс IMFSensorActivityMonitor (mfidl.h)

Предоставляет методы для управления монитором активности датчика.

Наследование

Интерфейс IMFSensorActivityMonitor наследуется от интерфейса IUnknown . IMFSensorActivityMonitor также имеет следующие типы членов:

Методы

Интерфейс IMFSensorActivityMonitor имеет следующие методы.

 
IMFSensorActivityMonitor::Start

Запускает монитор активности датчика.
IMFSensorActivityMonitor::Stop

Останавливает монитор активности датчика.

Комментарии

Получите экземпляр этого класса, вызвав MFCreateSensorActivityMonitor. Отчеты об активности датчиков доставляются через интерфейс IMFSensorActivitiesReportCallback , переданный в этот метод.

Примеры

В приведенных ниже примерах для создания класса обратного вызова COM и библиотек реализации Windows (WIL)используется C++/WinRT.

Полный пример проекта 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, в этом примере используется значение 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
Header mfidl.h