Bagikan melalui


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