Interfaz IMFSensorActivityMonitor (mfidl.h)

Proporciona métodos para controlar un monitor de actividad del sensor.

Herencia

La interfaz IMFSensorActivityMonitor hereda de la interfaz IUnknown . IMFSensorActivityMonitor también tiene estos tipos de miembros:

Métodos

La interfaz IMFSensorActivityMonitor tiene estos métodos.

 
IMFSensorActivityMonitor::Start

Inicia el monitor de actividad del sensor.
IMFSensorActivityMonitor::Stop

Detiene el monitor de actividad del sensor.

Comentarios

Obtenga una instancia de esta clase llamando a MFCreateSensorActivityMonitor. Los informes de actividad del sensor se entregan a través de la interfaz IMFSensorActivitiesReportCallback que se pasa a este método.

Ejemplos

Los ejemplos siguientes usan C++/WinRT para crear la clase de devolución de llamada COM y las bibliotecas de implementación de Windows (WIL).

Se puede encontrar un proyecto de Visual Studio de ejemplo completo en el repositorio de GitHub windows-Camera.

En el ejemplo siguiente se muestra una declaración de clase que implementa 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;
};

En el ejemplo siguiente se muestra la implementación de la devolución de llamada OnActivitiesReport .

La función OnActivitiesReport actualiza un miembro de clase booleano para indicar si el dispositivo del sensor consultado está actualmente en uso y, a continuación, establece un evento para indicar que se ha obtenido el estado.

Tenga en cuenta que la devolución de llamada se puede llamar varias veces y puede que no contenga ningún informe, por lo que el evento solo se establece cuando se encontraron informes.


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;
}

En este ejemplo se muestra un método de clase que espera a que la devolución de llamada OnActivitiesReport indique el evento. Como OnActivitiesReport solo setEvent cuando se encuentren las actividades en las que se encuentre, queremos usar un valor de tiempo de espera razonable para WaitForSingleObject, en este ejemplo se usan 500 ms y los casos de tiempo de espera se traducirán a "cámara no en uso".

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

    return false;
}

En el ejemplo siguiente se muestra una implementación que llama a MFCreateSensorActivityMonitor para crear el monitor de actividad y, a continuación, llama al método de clase IsInUse mostrado anteriormente para determinar si el sensor especificado está actualmente en uso.

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;
}

Requisitos

   
Cliente mínimo compatible Windows 10, versión 1703 [solo aplicaciones de escritorio]
Servidor mínimo compatible No se admite ninguno
Plataforma de destino Windows
Encabezado mfidl.h