Antarmuka IMFSensorActivityMonitor (mfidl.h)
Menyediakan metode untuk mengontrol monitor aktivitas sensor.
Warisan
Antarmuka IMFSensorActivityMonitor mewarisi dari antarmuka IUnknown . IMFSensorActivityMonitor juga memiliki jenis anggota ini:
Metode
Antarmuka IMFSensorActivityMonitor memiliki metode ini.
IMFSensorActivityMonitor::Start Memulai monitor aktivitas sensor. |
IMFSensorActivityMonitor::Stop Menghentikan monitor aktivitas sensor. |
Keterangan
Dapatkan instans kelas ini dengan memanggil MFCreateSensorActivityMonitor. Laporan aktivitas sensor dikirimkan melalui antarmuka IMFSensorActivitiesReportCallback yang diteruskan ke metode ini.
Contoh
Contoh di bawah ini menggunakan C++/WinRT untuk menulis kelas panggilan balik COM dan Windows Implementation Libraries (WIL).
Sampel lengkap proyek Visual Studio dapat ditemukan dari repositori GitHub Windows-Camera
Contoh berikut menunjukkan deklarasi kelas yang mengimplementasikan 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;
};
Contoh berikutnya menunjukkan implementasi panggilan balik OnActivitiesReport .
Fungsi OnActivitiesReport memperbarui anggota kelas boolean untuk menunjukkan apakah perangkat sensor yang dikueri saat ini sedang digunakan dan kemudian mengatur peristiwa untuk memberi sinyal bahwa status telah diperoleh.
Perhatikan bahwa panggilan balik dapat dipanggil beberapa kali dan mungkin tidak berisi laporan apa pun, sehingga peristiwa hanya diatur saat laporan ditemukan.
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;
}
Contoh ini menunjukkan metode kelas yang menunggu peristiwa disinyalkan oleh panggilan balik OnActivitiesReport . Karena OnActivitiesReport hanya akan MengaturEvent ketika aktivitas di mana ditemukan, kami ingin menggunakan beberapa nilai batas waktu yang wajar untuk WaitForSingleObject, contoh ini menggunakan 500ms dan setiap kasus batas waktu akan diterjemahkan ke "kamera tidak digunakan".
bool MyCameraNotificationCallback::IsInUse( )
{
if (_event.wait(500))
{
return _inUse;
}
return false;
}
Contoh berikut menunjukkan implementasi yang memanggil MFCreateSensorActivityMonitor untuk membuat monitor aktivitas lalu memanggil metode kelas IsInUse yang ditunjukkan di atas untuk menentukan apakah sensor yang ditentukan saat ini sedang digunakan.
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;
}
Persyaratan
Klien minimum yang didukung | Windows 10, versi 1703 [hanya aplikasi desktop] |
Server minimum yang didukung | Tidak ada yang didukung |
Target Platform | Windows |
Header | mfidl.h |