擷取和設定感應器屬性
本主題描述如何擷取和設定感應器屬性的值。 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;
}
相關主題