Partager via


Interface IMFSensorActivityMonitor (mfidl.h)

Fournit des méthodes pour contrôler un moniteur d’activité de capteur.

Héritage

L’interface IMFSensorActivityMonitor hérite de l’interface IUnknown. IMFSensorActivityMonitor a également les types de membres suivants :

Méthodes

L’interface IMFSensorActivityMonitor utilise ces méthodes.

 
IMFSensorActivityMonitor::Start

Démarre le moniteur d’activité du capteur.
IMFSensorActivityMonitor::Stop

Arrête le moniteur d’activité du capteur.

Notes

Obtenez un instance de cette classe en appelant MFCreateSensorActivityMonitor. Les rapports d’activité des capteurs sont fournis via l’interface IMFSensorActivitiesReportCallback transmise à cette méthode.

Exemples

Les exemples ci-dessous utilisent C++/WinRT pour créer une classe de rappel COM et des bibliothèques d’implémentation Windows (WIL).

L’exemple complet de projet Visual Studio est disponible à partir du référentiel GitHub Windows-Camera

L’exemple suivant montre une déclaration de classe qui implémente 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;
};

L’exemple suivant montre l’implémentation du rappel OnActivitiesReport .

La fonction OnActivitiesReport met à jour un membre de classe booléenne pour indiquer si le périphérique de capteur interrogé est en cours d’utilisation, puis définit un événement pour signaler que le status a été obtenu.

Notez que le rappel peut être appelé plusieurs fois et peut ne pas contenir de rapports. L’événement n’est donc défini que lorsque des rapports ont été trouvés.


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

Cet exemple montre une méthode de classe qui attend que l’événement soit signalé par le rappel OnActivitiesReport . Comme OnActivitiesReport n’est défini que sur SetEvent lorsque les activités sont trouvées, nous voulons utiliser une valeur de délai d’expiration raisonnable pour WaitForSingleObject, cet exemple utilise 500 ms et tous les cas de délai d’expiration sont traduits en « caméra non utilisée ».

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

    return false;
}

L’exemple suivant montre une implémentation qui appelle MFCreateSensorActivityMonitor pour créer le moniteur d’activité, puis appelle la méthode de classe IsInUse ci-dessus pour déterminer si le capteur spécifié est actuellement utilisé.

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

Spécifications

   
Client minimal pris en charge Windows 10, version 1703 [applications de bureau uniquement]
Serveur minimal pris en charge Aucun pris en charge
Plateforme cible Windows
En-tête mfidl.h