IMFSensorActivityMonitor インターフェイス (mfidl.h)
センサー アクティビティ モニターを制御するためのメソッドを提供します。
継承
IMFSensorActivityMonitor インターフェイスは、IUnknown インターフェイスから継承します。 IMFSensorActivityMonitor には、次の種類のメンバーもあります。
メソッド
IMFSensorActivityMonitor インターフェイスには、これらのメソッドがあります。
IMFSensorActivityMonitor::Start センサー アクティビティ モニターを起動します。 |
IMFSensorActivityMonitor::Stop センサー アクティビティ モニターを停止します。 |
解説
MFCreateSensorActivityMonitor を呼び出して、このクラスのインスタンスを取得します。 センサー アクティビティ レポートは、このメソッドに渡される IMFSensorActivitiesReportCallback インターフェイスを介して配信されます。
例
次の例では、 C++/WinRT を使用して COM コールバック クラス と Windows 実装ライブラリ (WIL) を作成しています。
完全なサンプル Visual Studio プロジェクトは、Windows-Camera GitHub リポジトリから確認できます
次の例は、 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;
};
次の例は、 OnActivitiesReport コールバックの実装を示しています。
OnActivitiesReport 関数は、ブール型のクラス メンバーを更新して、クエリ対象のセンサー デバイスが現在使用されているかどうかを示し、状態が取得されたことを通知するイベントを設定します。
コールバックは複数回呼び出され、レポートが含まれていない可能性があるため、イベントはレポートが見つかったときにのみ設定されることに注意してください。
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;
}
この例では、 OnActivitiesReport コールバックによってイベントが通知されるのを待機するクラス メソッドを示します。 OnActivitiesReport では、アクティビティが見つかった場合にのみ SetEvent が発生するため、WaitForSingleObject には妥当なタイムアウト値を使用します。この例では 500 ミリ秒が使用され、タイムアウトケースはすべて "カメラが使用されていません" に変換されます。
bool MyCameraNotificationCallback::IsInUse( )
{
if (_event.wait(500))
{
return _inUse;
}
return false;
}
次の例は、 MFCreateSensorActivityMonitor を呼び出してアクティビティ モニターを作成し、上記の IsInUse クラス メソッドを呼び出して、指定したセンサーが現在使用されているかどうかを判断する実装を示しています。
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;
}
要件
サポートされている最小のクライアント | Windows 10バージョン 1703 [デスクトップ アプリのみ] |
サポートされている最小のサーバー | サポートなし |
対象プラットフォーム | Windows |
ヘッダー | mfidl.h |