Raw Input Device informations | CodeGuru

Raw Input Device informations

I was working with a small project where we had the task to identify raw input devices attached to the system. We also needed to retrieve the attached raw input device informations in detail. I found few online articles and APIs on MSDN which proved to be very useful in completing the task assigned to […]

Written By
CodeGuru Staff
CodeGuru Staff
Mar 17, 2009
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

I was working with a small project where we had the task to identify raw
input devices attached to the system. We also needed to retrieve the attached
raw input device informations in detail. I found few online articles and APIs on
MSDN which proved to be very useful in completing the task assigned to me.


In this article I am going to explain and demonstrate the usage of these RAW
Input APIs. As a additional reference I strongly recommend the MSDN article( RAW INPUT ). In the example chosen, I have used two
Win32 APIs to enumerate the attached raw input devices, each device name and
device informations. The following section describes two Win32 APIs briefly.

UINT GetRawInputDeviceList( PRAWINPUTDEVICELIST pRawInputDeviceList,
                            PUINT puiNumDevices,
                            UINT cbSize);

This function is used for enumeration of raw input devices. For full description please follow MSDN article ( GetRawInputDeviceList ).

UINT GetRawInputDeviceInfo( HANDLE hDevice,
                            UINT uiCommand,
                            LPVOID pData,
                            PUINT pcbSize);

To get detailed information about the attached devices, use the  GetRawInputDeviceInfo function. The following demo code snippet is the implemenation details to get attached raw input devices name and information:

// HIDDeviceCheck.cpp : Defines the entry point for the console application.
//
#include “stdafx.h”
#include “HIDDeviceCheck.h”
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// The one and only application object
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
   int nRetCode = 0;
   // initialize MFC and print and error on failure
   if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
   {
      // TODO: change error code to suit your needs
      _tprintf(_T(“Fatal Error: MFC initialization failed\n”));
      nRetCode = 1;
   }
   else
   {
      // TODO: code your application’s behavior here.
      UINT nDevices;
      PRAWINPUTDEVICELIST pRawInputDeviceList;
      if (GetRawInputDeviceList(NULL, &nDevices, sizeof(RAWINPUTDEVICELIST)) != 0)
      {
         cout << “Errors…” << endl;
         return 1;
      }
      if ((pRawInputDeviceList = (PRAWINPUTDEVICELIST)malloc(sizeof(RAWINPUTDEVICELIST) * nDevices)) == NULL)
      {
         cout << “Initialization failed…” << endl;
         return 1;
      }
      int nNoOfDevices = 0;
      if ((nNoOfDevices = GetRawInputDeviceList(pRawInputDeviceList, &nDevices, sizeof(RAWINPUTDEVICELIST))) == ((UINT) – 1))
      {
         // Error
         return 1;
      }
      RID_DEVICE_INFO rdi;
      rdi.cbSize = sizeof(RID_DEVICE_INFO);
      for(int i = 0; i < nNoOfDevices; i++)
      {
         UINT size = 256;
         TCHAR tBuffer[256] = {0};
         if(GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, RIDI_DEVICENAME, tBuffer, &size) < 0)
         {
            // Error in reading device name
         }
         // cout << “Device Name: ” << tBuffer << endl;
         _tprintf(L”Device Name: %s\n”, tBuffer);
         UINT cbSize = rdi.cbSize;
         if(GetRawInputDeviceInfo(pRawInputDeviceList[i].hDevice, RIDI_DEVICEINFO, &rdi, &cbSize) < 0)
         {
            // Error in reading information
         }
         if(rdi.dwType == RIM_TYPEMOUSE)
         {
            cout << “ID for Mouse:” << rdi.mouse.dwId << endl;
            cout << “Number of Buttons:” << rdi.mouse.dwNumberOfButtons << endl;
            cout << “Sample rate(Number of data points):” << rdi.mouse.dwSampleRate << endl;
            cout << “**************************” << endl;
         }
         if(rdi.dwType == RIM_TYPEKEYBOARD)
         {
            cout << “Keyboard Mode:” << rdi.keyboard.dwKeyboardMode << endl;
            cout << “Number of function keys:” << rdi.keyboard.dwNumberOfFunctionKeys << endl;
            cout << “Number of indicators:” << rdi.keyboard.dwNumberOfIndicators << endl;
            cout << “Number of keys total: ” << rdi.keyboard.dwNumberOfKeysTotal << endl;
            cout << “Type of the keyboard: ” << rdi.keyboard.dwType << endl;
            cout << “Subtype of the keyboard: ” << rdi.keyboard.dwSubType << endl;
            cout << “***********************” << endl;
         }
         if(rdi.dwType == RIM_TYPEHID)
         {
            cout << “Vendor Id:” << rdi.hid.dwVendorId << endl;
            cout << “Product Id:” << rdi.hid.dwProductId << endl;
            cout << “Version No:” << rdi.hid.dwVersionNumber << endl;
            cout << “Usage for the device: ” << rdi.hid.usUsage << endl;
            cout << “Usage Page for the device: ” << rdi.hid.usUsagePage << endl;
            cout << “***********************” << endl;
         }
      }
      free(pRawInputDeviceList);
   }
   return nRetCode;
}

The snap shot of the output looks like the picture below:


CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.