Получение и настройка свойств датчика
В этом разделе описывается, как получить и задать значения для свойств датчика. Интерфейс ISensor предоставляет методы для задания и получения значений для свойств датчика.
Получение свойств датчика
Вы можете получить некоторые значения свойств из датчика, прежде чем пользователь включил его. Такие сведения, как имя производителя или модель датчика, помогут вам решить, может ли ваша программа использовать датчик.
Вы можете получить одно значение свойства или получить коллекцию значений свойств вместе. Чтобы получить одно значение, вызовите ISensor::GetProperty. Чтобы получить коллекцию значений, вызовите ISensor::GetProperties. Вы можете получить все свойства сенсора, передав NULL в первый параметр для ISensor::GetProperties.
В следующем примере кода создается вспомогающая функция, которая выводит значение одного свойства. Функция получает указатель на датчик, из которого извлекается значение, и ключ свойства, содержащий печатаемое свойство. Функция может распечатать значения чисел, строк и GUID, но не другие, более сложные типы.
HRESULT PrintSensorProperty(ISensor* pSensor, REFPROPERTYKEY pk)
{
assert(pSensor);
HRESULT hr = S_OK;
PROPVARIANT pv = {};
hr = pSensor->GetProperty(pk, &pv);
if(SUCCEEDED(hr))
{
if(pv.vt == VT_UI4) // Number
{
wprintf_s(L"\nSensor integer value: %u\n", pv.ulVal);
}
else if(pv.vt == VT_LPWSTR) // String
{
wprintf_s(L"\nSensor string value: %s\n", pv.pwszVal);
}
else if(pv.vt == VT_CLSID) // GUID
{
int iRet = 0;
// Convert the GUID to a string.
OLECHAR wszGuid[39] = {}; // Buffer for string.
iRet = ::StringFromGUID2(*(pv.puuid), wszGuid, 39);
assert(39 == iRet); // Count of characters returned for GUID.
wprintf_s(L"\nSensor GUID value: %s\n", wszGuid);
}
else // Interface or vector
{
wprintf_s(L"\nSensor property is a compound type. Unable to print value.");
}
}
PropVariantClear(&pv);
return hr;
}
В следующем примере кода создается функция, которая извлекает и выводит коллекцию свойств. Набор свойств для печати определяется массивом с именем SensorProperties.
HRESULT PrintSensorProperties(ISensor* pSensor)
{
assert(pSensor);
HRESULT hr = S_OK;
DWORD cVals = 0; // Count of returned properties.
IPortableDeviceKeyCollection* pKeys = NULL; // Input
IPortableDeviceValues* pValues = NULL; // Output
// Properties to print.
const PROPERTYKEY SensorProperties[] =
{
SENSOR_PROPERTY_MANUFACTURER,
SENSOR_PROPERTY_SERIAL_NUMBER,
SENSOR_PROPERTY_DESCRIPTION,
SENSOR_PROPERTY_FRIENDLY_NAME
};
// CoCreate a key collection to store property keys.
hr = CoCreateInstance(CLSID_PortableDeviceKeyCollection,
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pKeys));
if(SUCCEEDED(hr))
{
// Add the properties to the key collection.
for (DWORD dwIndex = 0; dwIndex < ARRAYSIZE(SensorProperties); dwIndex++)
{
hr = pKeys->Add(SensorProperties[dwIndex]);
if(FAILED(hr))
{
// Unexpected.
// This example returns the failed HRESULT.
// You may choose to ignore failures, here.
break;
}
}
}
if(SUCCEEDED(hr))
{
// Retrieve the properties from the sensor.
hr = pSensor->GetProperties(pKeys, &pValues);
}
if(SUCCEEDED(hr))
{
// Get the number of values returned.
hr = pValues->GetCount(&cVals);
}
if(SUCCEEDED(hr))
{
PROPERTYKEY pk; // Keys
PROPVARIANT pv = {}; // Values
// Loop through the values;
for (DWORD i = 0; i < cVals; i++)
{
// Get the value at the current index.
hr = pValues->GetAt(i, &pk, &pv);
if(SUCCEEDED(hr))
{
// Find and print the property.
if(IsEqualPropertyKey(pk, SENSOR_PROPERTY_MANUFACTURER))
{
wprintf_s(L"\nManufacturer: %s\n", pv.pwszVal);
}
else if(IsEqualPropertyKey(pk, SENSOR_PROPERTY_SERIAL_NUMBER))
{
wprintf_s(L"Serial number: %s\n", pv.pwszVal);
}
else if(IsEqualPropertyKey(pk, SENSOR_PROPERTY_FRIENDLY_NAME))
{
wprintf_s(L"Friendly name: %s\n", pv.pwszVal);
}
else if(IsEqualPropertyKey(pk, SENSOR_PROPERTY_DESCRIPTION))
{
wprintf_s(L"Description: %s\n", pv.pwszVal);
}
}
PropVariantClear(&pv);
} // end i loop
}
SafeRelease(&pKeys);
SafeRelease(&pValues);
return hr;
};
Настройка свойств датчика
Прежде чем задать значения свойств для датчика, пользователь должен включить датчик. Кроме того, не все свойства датчика можно задать.
Чтобы задать одно или несколько значений свойств, вызовите ISensor::SetProperties. Этот метод предоставляется с помощью указателя IPortableDeviceValues, содержащего коллекцию свойств, которые необходимо задать, и их связанные значения. Метод возвращает соответствующий интерфейс IPortableDeviceValues, который может содержать коды ошибок для свойств, которые не удалось задать.
В следующем примере кода создается вспомогающая функция, которая задает новое значение для свойства SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL. Функция принимает указатель на датчик, для которого необходимо задать свойство, а значение ULONG, указывающее новый интервал отчета. (Обратите внимание, что установка значения для данного свойства не гарантирует, что датчик примет указанное значение. Сведения о том, как работает это свойство, см. в свойства датчика.)
HRESULT SetCurrentReportInterval(ISensor* pSensor, ULONG ulNewInterval)
{
assert(pSensor);
HRESULT hr = S_OK;
IPortableDeviceValues* pPropsToSet = NULL; // Input
IPortableDeviceValues* pPropsReturn = NULL; // Output
// Create the input object.
hr = CoCreateInstance(__uuidof(PortableDeviceValues),
NULL,
CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pPropsToSet));
if(SUCCEEDED(hr))
{
// Add the current report interval property.
hr = pPropsToSet->SetUnsignedIntegerValue(SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, ulNewInterval);
}
if(SUCCEEDED(hr))
{
// Only setting a single property, here.
hr = pSensor->SetProperties(pPropsToSet, &pPropsReturn);
}
// Test for failure.
if(hr == S_FALSE)
{
HRESULT hrError = S_OK;
// Check results for failure.
hr = pPropsReturn->GetErrorValue(SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, &hrError);
if(SUCCEEDED(hr))
{
// Print an error message.
wprintf_s(L"\nSetting current report interval failed with error 0x%X\n", hrError);
// Return the error code.
hr = hrError;
}
}
else if(hr == E_ACCESSDENIED)
{
// No permission. Take appropriate action.
}
SafeRelease(&pPropsToSet);
SafeRelease(&pPropsReturn);
return hr;
}
Связанные разделы