Click here to Skip to main content
13,091,363 members (50,333 online)
Click here to Skip to main content
Add your own
alternative version


30 bookmarked
Posted 2 May 2009

Sensor API: Make your Win32 applications environment-aware in Windows 7

, 28 Sep 2009
Rate this:
Please Sign up or sign in to vote.
A "Sensor Explorer" demonstration of the Sensor API in Windows 7.


The Sensor API is a simple Windows 7 ActiveX interface that allows you to communicate with sensors. Sensors can detect light, temperature, electricity, location (GPS), motion and so on. (The supported list of categories is available in MSDN).

You need

Where to Find Sensors?

In the SDK, there is a Virtual Light Sensor that can simulate a light sensor. As Windows 7 is released, more and more devices will support the Sensors abstraction API.

In my site, I've also created a GPS Sensor Driver that reads actual GPS data from a COM port. Read more here.


The sample here provides code for both full (explorer) sensor capabilities and also a simple SENSOR namespace that implements sensors in a library you can use. The steps for the full explorer are:

  • Call CoCreateInstance() to instantiate an ISensorManager.
  • Call ISensorManager::GetSensorsByCategory using the requested category (all categories in MSDN).
  • From the returned ISensorCollection, call GetCount() to get the number of sensors in that category, then call GetAt() to retrieve an ISensor.
  • Use ISensor methods to learn about the sensor properties, type, ID etc.
  • To get the supported data fields, call ISensor::GetSupportedDataFields().
  • Use GetCount() and GetAt() from the returned IPortableDeviceCollection to get the data fields.
  • Use ISensor::GetData() to retrieve the current data in a ISensorDataReport.
  • Use ISensorDataReport::GetSensorValue to get a specific value, use ISensorDataReport::GetTimestamp to return the time at which the data was collected.

Sensors are disabled by default, so you may have to call ISensorManager::RequestPermissions if you get an access denied error when retrieving the sensor state.

All this stuff is used in main.cpp.

Sensor Manager Events

The Sensor Manager can notify you when something occurs. Implement an ISensorManagerEvents, then pass it to ISensorManager::SetEventSink. Currently, this interface implements the OnSensorEnter() function which is called when a sensor is available.

Sensor Events

The Sensor can notify you when something occurs. Implement an ISensorEvents, then pass it to ISensor::SetEventSink, then call ISensor::SetEventInterest to indicate the types of notifications you want to receive. Currently, ISensorEvents implements four member functions which notify you when an event occurs, when data is changed, when state is changed, and when the sensor is disabled.

Using an Actual Sensor

The Virtual Light sensor is OK for testing purposes, but we need real data. I've created a small sample driver project, GPSDirect, which can read and parse actual GPS information from a COM port (Bluetooth, USB etc.). This driver currently supports parsing GGA and RMC sentences to provide position information.


In case you just want a simple interface, you can use my senslib* project and the SENSOR namespace. This currently implements a SENSOR and a LIGHTSENSOR class to be used as follows:

    HWND hT = GetDlgItem(hh,701);
    HWND hL2 = GetDlgItem(hh,902);
    static SENSOR::LIGHTSENSOR* ls = 0;
        case WM_INITDIALOG:
            if (!SENSOR::InitializeSensorManager())
            // Make sure we are running under Windows 7
            // Install the light sensor, giving it our HWND and a custom message
            ls = new SENSOR::LIGHTSENSOR(hh,WM_USER);
        case WM_USER:
            // Sent by LIGHTSENSOR.
            // ww == 0 -> ll == address of a SENSOR_DATA containing the sensor data
            // ww == 1 -> Sensor is disabled
            // ww == 2 -> State changed, ll = the new SensorState
            if (ww == 0)
                SENSOR::SENSOR_DATA* data = (SENSOR::SENSOR_DATA*)ll;
                if (data)
                    for(unsigned int i = 0 ; i < data->Num ; i++)
                        if (data->keys[i] == SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX)
                            TCHAR x[100];
                            _stprintf(x,_T("Lux: %f"),data->data[i].fltVal);
            return 0;
        case WM_CLOSE:
            delete ls;
            return 0;
    return 0;


  • Add the Location API.


  • 28 - 9 - 2009: Library update and GPS Sensor.
  • 2 - 5 - 2009: First release.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Michael Chourdakis
Greece Greece
I'm working in C++, PHP , Java, Windows, iOS and Android.

I 've a PhD in Digital Signal Processing and I specialize in Pro Audio applications.

My home page:

You may also be interested in...


Comments and Discussions

Questionviruses found in compressed file? Pin
Jeffrey_YH5-Sep-10 20:03
memberJeffrey_YH5-Sep-10 20:03 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.170813.1 | Last Updated 28 Sep 2009
Article Copyright 2009 by Michael Chourdakis
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid