Compartilhar via


Interface IMFSensorActivityMonitor (mfidl.h)

Fornece métodos para controlar um monitor de atividade do sensor.

Herança

A interface IMFSensorActivityMonitor herda da interface IUnknown . IMFSensorActivityMonitor também tem estes tipos de membros:

Métodos

A interface IMFSensorActivityMonitor tem esses métodos.

 
IMFSensorActivityMonitor::Start

Inicia o monitor de atividade do sensor.
IMFSensorActivityMonitor::Stop

Interrompe o monitor de atividade do sensor.

Comentários

Obtenha uma instância dessa classe chamando MFCreateSensorActivityMonitor. Os relatórios de atividade do sensor são entregues por meio da interface IMFSensorActivitiesReportCallback passada para esse método.

Exemplos

Os exemplos a seguir estão usando C++/WinRT para criar a classe de retorno de chamada COM e o WIL (Bibliotecas de Implementação do Windows).

O projeto de exemplo completo do Visual Studio pode ser encontrado no repositório GitHub windows-camera

O exemplo a seguir mostra uma declaração de classe 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;
};

O exemplo a seguir mostra a implementação do retorno de chamada OnActivitiesReport .

A função OnActivitiesReport atualiza um membro de classe booliana para indicar se o dispositivo de sensor consultado está atualmente em uso e, em seguida, define um evento para sinalizar que o status foi obtido.

Observe que o retorno de chamada pode ser chamado várias vezes e pode não conter relatórios, portanto, o evento só é definido quando os relatórios foram encontrados.


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

Este exemplo mostra um método de classe que aguarda o evento ser sinalizado pelo retorno de chamada OnActivitiesReport . Como OnActivitiesReport só definirá SetEvent quando as atividades forem encontradas, queremos usar algum valor de tempo limite razoável para WaitForSingleObject, este exemplo usa 500ms e quaisquer casos de tempo limite serão convertidos em "câmera não em uso".

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

    return false;
}

O exemplo a seguir mostra uma implementação que chama MFCreateSensorActivityMonitor para criar o monitor de atividade e, em seguida, chama o método de classe IsInUse mostrado acima para determinar se o sensor especificado está em uso no momento.

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 com suporte Windows 10, versão 1703 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Nenhum compatível
Plataforma de Destino Windows
Cabeçalho mfidl.h