IMFSensorActivityMonitor
COM公式ドキュメント
センサーアクティビティモニターを制御するためのメソッドを提供します。
解説(Remarks)
このクラスのインスタンスは MFCreateSensorActivityMonitor を呼び出して取得します。センサーのアクティビティレポートは、このメソッドに渡される IMFSensorActivitiesReportCallback インターフェイスを通じて配信されます。
例
以下の例では、C++/WinRT を使用した COM コールバッククラスの実装と Windows Implementation Libraries (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;
}
}
// デバイスが使用中であることを示すフラグを設定し、イベントを通知する
_inUse = inUse;
if (cProcCount > 0)
{
_event.SetEvent();
}
return S_OK;
}
この例は、OnActivitiesReport コールバックによってイベントが通知されるのを待機するクラスメソッドを示しています。 OnActivitiesReport はアクティビティが見つかった場合にのみ SetEvent を呼び出すため、WaitForSingleObject には妥当なタイムアウト値を使用します。この例では 500ms を使用しており、タイムアウトが発生した場合はすべて「カメラは使用されていない」として扱われます。
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));
// IMFSensorActivitiesReportCallback を渡して IMFSensorActivityMonitor を作成する。
RETURN_IF_FAILED(MFCreateSensorActivityMonitor(cameraNotificationCallback.get(), &activityMonitor));
// モニターを開始する
RETURN_IF_FAILED(activityMonitor->Start());
// 監視対象のデバイスが使用中かどうかを確認するメソッドを呼び出す。
inUse = cameraNotificationCallback->IsInUse();
// アクティビティモニターを停止する。
RETURN_IF_FAILED(activityMonitor->Stop());
// モニターをシャットダウンする。
RETURN_IF_FAILED(activityMonitor.query_to(&spShutdown));
RETURN_IF_FAILED(spShutdown->Shutdown());
return S_OK;
}
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
センサーアクティビティモニターを開始します。
戻り値
このメソッドは HRESULT を返します。返される値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| センサーアクティビティモニターは既に開始されています。 |
センサーアクティビティモニターを停止します。
戻り値
このメソッドは HRESULT を返します。返される値には次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFSensorActivityMonitor "{D0CEF145-B3F4-4340-A2E5-7A5080CA05CB}"
#usecom global IMFSensorActivityMonitor IID_IMFSensorActivityMonitor "{}"
#comfunc global IMFSensorActivityMonitor_Start 3
#comfunc global IMFSensorActivityMonitor_Stop 4
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。