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 |