Поделиться через


Получение объекта датчика

Чтобы получить объект датчика, используйте интерфейс ISensorManager. Этот интерфейс можно рассматривать как корневой интерфейс ДЛЯ API датчика. Чтобы использовать ISensorManager, необходимо сначала вызвать метод COM CoCreateInstance.

В следующем примере кода создается экземпляр диспетчера датчиков.

// Create the sensor manager.
hr = CoCreateInstance(CLSID_SensorManager, 
                        NULL, CLSCTX_INPROC_SERVER,
                        IID_PPV_ARGS(&pSensorManager));

if(hr == HRESULT_FROM_WIN32(ERROR_ACCESS_DISABLED_BY_POLICY))
{
    // Unable to retrieve sensor manager due to 
    // group policy settings. Alert the user.
}

После успешного получения указателя на ISensorManagerможно получить датчики по категориям, типу или идентификатору. При получении датчиков по типу или категории вы получаете указатель на интерфейс ISensorCollection, содержащий все доступные датчики, принадлежащие запрошенной категории или типу. При получении датчика по идентификатору вы получите указатель на интерфейс ISensor, представляющий запрошенный уникальный датчик.

В следующем примере кода извлекается коллекция датчиков, принадлежащих категории с именем SAMPLE_SENSOR_CATEGORY_DATE_TIME. Затем код получает первый датчик в коллекции по его индексу.

// Get the sensor collection.
hr = pSensorManager->GetSensorsByCategory(SAMPLE_SENSOR_CATEGORY_DATE_TIME, &pSensorColl);
  
if(SUCCEEDED(hr))
{
    ULONG ulCount = 0;

    // Verify that the collection contains
    // at least one sensor.
    hr = pSensorColl->GetCount(&ulCount);

    if(SUCCEEDED(hr))
    {
        if(ulCount < 1)
        {
            wprintf_s(L"\nNo sensors of the requested category.\n");
            hr = E_UNEXPECTED;
        }
    }
}

if(SUCCEEDED(hr))
{
    // Get the first available sensor.
    hr = pSensorColl->GetAt(0, &pSensor);
}

Обратите внимание, что можно получить все доступные датчики с помощью SENSOR_CATEGORY_ALL.

Аналогичным образом можно получить датчики определенного типа.

В следующем примере кода извлекается коллекция датчиков типа, названного SAMPLE_SENSOR_TYPE_TIME. Затем код получает первый датчик в коллекции по его индексу.

// Get the sensor collection.
hr = pSensorManager->GetSensorsByType(SAMPLE_SENSOR_TYPE_TIME, &pSensorColl);
  
if(SUCCEEDED(hr))
{
    ULONG ulCount = 0;

    // Verify that the collection contains
    // at least one sensor.
    hr = pSensorColl->GetCount(&ulCount);

    if(SUCCEEDED(hr))
    {
        if(ulCount < 1)
        {
            wprintf_s(L"\nNo sensors of the requested type.\n");
            hr = E_UNEXPECTED;
        }
    }
}

if(SUCCEEDED(hr))
{
    // Get the first available sensor.
    hr = pSensorColl->GetAt(0, &pSensor);
}

Чтобы получить датчик по его идентификатору, необходимо знать уникальный идентификатор датчика. Датчики обычно создают этот идентификатор при первом подключении, чтобы обеспечить идентификацию нескольких датчиков одной и той же модели. Это означает, что вы, вероятно, не будете знать идентификатор датчика заранее. Однако если вы сохранили копию определенного идентификатора датчика, который вы ранее получили, например путем вызова ISensor::GetID, вы можете снова получить тот же датчик.

В следующем примере кода показано, как получить датчик с помощью его идентификатора.

ISensor* pSensor = NULL;

// Get the sensor collection.
hr = pSensorManager->GetSensorByID(SAMPLE_SENSOR_TIME_ID, &pSensor);

Вы также можете получать датчики, когда они становятся доступны, путем получения уведомления от диспетчера датчиков. Дополнительные сведения см. в разделе ISensorManager::SetEventSink.

ISensorManagerEvents::OnSensorEnter