Freigeben über


Abrufen von Sensordatenfeldern

Von Bedeutung

Verwenden Sie stattdessen die UWP-Sensor-API .

Die COM-basierte Sensor-API ist veraltet und sollte nicht in neuen Anwendungen verwendet werden. Es sind keine zusätzlichen Features oder Verbesserungen geplant, und der Support wird eingeschränkt.

In diesem Thema wird beschrieben, wie Daten von einem Sensor synchron und asynchron abgerufen werden.

Synchrones Abrufen von Daten

Sie können Sensordaten synchron abrufen, indem Sie ISensor::GetDataaufrufen.

Der folgende Beispielcode ruft einen Sensordatenbericht ab und ruft dann drei einzelne Datenfeldwerte ab. Der Beispielsensor stellt benutzerdefinierte Daten zu der aktuellen Ortszeit in Stunden-, Minuten- und zweiten Datenfeldern bereit. Die Variable mit dem Namen pSensor enthält einen Zeiger auf ISensor-, der den Sensor darstellt, der die Daten bereitstellt.

if(SUCCEEDED(hr))
{
    // Get the data report.
    hr = pSensor->GetData(&pReport);
}
  
if(SUCCEEDED(hr))
{
    PROPVARIANT var = {};

    hr = pReport->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_HOUR, &var);

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulHour = var.ulVal;                
        }
    }

    PropVariantClear(&var);

    hr = pReport->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_MINUTE, &var);

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulMinute = var.ulVal;
        }
    }

    PropVariantClear(&var);

    hr = pReport->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_SECOND, &var);

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulSecond = var.ulVal;
        }
    }

    PropVariantClear(&var);        

    if(SUCCEEDED(hr))
    {
        // Print the local time to the console window.
        wprintf_s(L"\nCurrent local time is: \n");
        wprintf_s(L"%02d:%02d:%02d (synchronous)\n\n", ulHour, ulMinute, ulSecond);
    }

asynchrones Abrufen von Daten

Sie können Sensordaten asynchron empfangen, indem Sie sich registrieren, um das ISensorEvents::OnDataUpdated-Ereignis zu empfangen. Um zu verstehen, wie man Sensorereignisrückrufe empfängt, sehen Sie sich Wie Sie Sensor-API-Ereignisse verwendenan.

Der folgende Beispielcode zeigt eine Implementierung von ISensorEvents::OnDataUpdated, die Datenwerte aus dem vom Ereignis bereitgestellten Datenbericht abruft. Der Beispielsensor stellt benutzerdefinierte Daten zu der aktuellen Ortszeit in Stunden-, Minuten- und zweiten Datenfeldern bereit.

STDMETHODIMP OnDataUpdated(
        ISensor *pSensor,
        ISensorDataReport *pNewData)
{
    HRESULT hr = S_OK;

    if(NULL == pNewData ||
       NULL == pSensor)
    {
        return E_INVALIDARG;
    }

    ULONG ulHour = 0;
    ULONG ulMinute = 0;
    ULONG ulSecond = 0;

    PROPVARIANT var = {};

    hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_HOUR, &var);

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulHour = var.ulVal;                
        }
    }

    PropVariantClear(&var);

    if(SUCCEEDED(hr))
    {
        hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_MINUTE, &var);
    }

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulMinute = var.ulVal;
        }
    }

    PropVariantClear(&var);

    if(SUCCEEDED(hr))
    {
        hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_SECOND, &var);
    }

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulSecond = var.ulVal;
        }
    }

    PropVariantClear(&var);

    if(SUCCEEDED(hr))
    {
        // Print
        wprintf_s(L"Current local time is: \n");
        wprintf_s(L"%02d:%02d:%02d (asynchronous)\n", ulHour, ulMinute, ulSecond);
    }

    return hr;
}