Sdílet prostřednictvím


Nastavení a načítání vlastností senzoru

Důležité

Místo toho použijte rozhraní API senzoru UWP.

Rozhraní API snímače založené na modelu COM je zastaralé a nemělo by se používat v nových aplikacích. Neplánují se žádné další funkce ani vylepšení a podpora bude omezená.

Toto téma popisuje, jak načíst a nastavit hodnoty vlastností senzoru. Rozhraní ISensor poskytuje metody pro nastavení a načtení hodnot pro vlastnosti senzoru.

Načítání vlastností senzoru

Některé hodnoty vlastností můžete načíst ze senzoru předtím, než ho uživatel povolí. Informace, jako je název výrobce nebo model senzoru, vám můžou pomoct rozhodnout, jestli váš program může senzor používat.

Můžete se rozhodnout načíst jednu hodnotu vlastnosti nebo načíst kolekci hodnot vlastností dohromady. Pokud chcete načíst jednu hodnotu, zavolejte ISensor::GetProperty. Chcete-li načíst kolekci hodnot, zavolejte ISensor::GetProperties. Vlastnosti senzoru můžete načíst tak, že předáte NULL jako první parametr do ISensor::GetProperties.

Následující příklad kódu vytvoří pomocnou funkci, která vytiskne hodnotu jedné vlastnosti. Funkce obdrží ukazatel na senzor, ze kterého chcete načíst hodnotu a klíč vlastnosti, která obsahuje vlastnost k tisku. Funkce může tisknout hodnoty pro čísla, řetězce a GUIDs, ale ne pro jiné složitější typy.

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;    
}

Následující příklad kódu vytvoří funkci, která načte a vytiskne kolekci vlastností. Sada vlastností k tisku je definována polem s názvem 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;
};

Nastavení vlastností senzoru

Než budete moct nastavit hodnoty vlastností senzoru, musí uživatel senzor povolit. Nelze také nastavit všechny vlastnosti senzoru.

Chcete-li nastavit jednu nebo více hodnot pro vlastnosti, zavolejte ISensor::SetProperties. V této metodě poskytnete ukazatel IPortableDeviceValues, který obsahuje kolekci vlastností, které mají být nastaveny, a jejich přidružené hodnoty. Metoda vrátí odpovídající IPortableDeviceValues rozhraní, které může obsahovat kódy chyb pro vlastnosti, které nelze nastavit.

Následující příklad kódu vytvoří pomocnou funkci, která nastaví novou hodnotu pro SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL vlastnost. Funkce přijímá ukazatel na senzor, pro který se má nastavit vlastnost, a ULONG hodnotu, která označuje nový interval reportu, který se má nastavit. (Všimněte si, že nastavení hodnoty pro tuto konkrétní vlastnost nezaručuje, že senzor přijme zadanou hodnotu. Informace o tom, jak tato vlastnost funguje, najdete v tématu Vlastnosti snímače.)

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;
}

vlastnosti senzoru