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


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

Чтобы получить объект датчика, используйте интерфейс 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