IMFSensorActivityMonitor-Schnittstelle (mfidl.h)

Stellt Methoden zum Steuern eines Sensoraktivitätsmonitors bereit.

Vererbung

Die IMFSensorActivityMonitor-Schnittstelle erbt von der IUnknown-Schnittstelle . IMFSensorActivityMonitor verfügt auch über die folgenden Membertypen:

Methoden

Die IMFSensorActivityMonitor-Schnittstelle verfügt über diese Methoden.

 
IMFSensorActivityMonitor::Start

Startet den Sensoraktivitätsmonitor.
IMFSensorActivityMonitor::Stop

Beendet den Sensoraktivitätsmonitor.

Hinweise

Rufen Sie einen instance dieser Klasse ab, indem Sie MFCreateSensorActivityMonitor aufrufen. Sensoraktivitätsberichte werden über die an diese Methode übergebene IMFSensorActivitiesReportCallback-Schnittstelle übermittelt.

Beispiele

Die folgenden Beispiele sind die Verwendung von C++/WinRT zum Erstellen einer COM-Rückrufklasse und windows-Implementierungsbibliotheken (WIL).

Das vollständige Visual Studio-Beispielprojekt finden Sie im GitHub-Repository für Windows-Camera

Das folgende Beispiel zeigt eine Klassendeklaration, die IMFSensorActivitiesReportCallback implementiert.

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

Das nächste Beispiel zeigt die Implementierung des OnActivitiesReport-Rückrufs .

Die OnActivitiesReport-Funktion aktualisiert einen booleschen Klassenmember, um anzugeben, ob das abgefragte Sensorgerät derzeit verwendet wird, und legt dann ein Ereignis fest, das signalisiert, dass die status abgerufen wurde.

Beachten Sie , dass der Rückruf mehrmals aufgerufen werden kann und keine Berichte enthalten kann, sodass das Ereignis nur festgelegt wird, wenn Berichte gefunden wurden.


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

Dieses Beispiel zeigt eine Klassenmethode, die wartet, bis das Ereignis durch den OnActivitiesReport-Rückruf signalisiert wird. Da der OnActivitiesReport nur SetEvent verwendet, wenn Aktivitäten gefunden wurden, möchten wir einen angemessenen Timeoutwert für WaitForSingleObject verwenden, verwendet dieses Beispiel 500 ms, und alle Timeoutfälle werden in "Kamera nicht verwendet" übersetzt.

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

    return false;
}

Das folgende Beispiel zeigt eine Implementierung, die MFCreateSensorActivityMonitor aufruft, um den Aktivitätsmonitor zu erstellen, und dann die oben gezeigte IsInUse-Klassenmethode aufruft, um festzustellen, ob der angegebene Sensor derzeit verwendet wird.

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

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 10, Version 1703 [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Nicht unterstützt
Zielplattform Windows
Kopfzeile mfidl.h