Today’s Little Program tells you whether a keyboard is attached to the computer. The short answer is “Enumerate the raw input devices and see if any of them is a keyboard.”
Remember: Little Programs don’t worry about silly things like race conditions.
#include <windows.h> #include <iostream> #include <vector> #include <algorithm> bool IsKeyboardPresent() { UINT numDevices = 0; if (GetRawInputDeviceList(nullptr, &numDevices, sizeof(RAWINPUTDEVICELIST)) != 0) { throw GetLastError(); } std::vector<RAWINPUTDEVICELIST> devices(numDevices); if (GetRawInputDeviceList(&devices[0], &numDevices, sizeof(RAWINPUTDEVICELIST)) == (UINT)-1) { throw GetLastError(); } return std::find_if(devices.begin(), devices.end(), [](RAWINPUTDEVICELIST& device) { return device.dwType == RIM_TYPEKEYBOARD; }) != devices.end(); } int __cdecl main(int, char**) { std::cout << IsKeyboardPresent() << std::endl; return 0; }
There is a race condition in this code if the number of devices changes between the two calls to GetRawInputDeviceList
. I will leave you to fix it before incorporating this code into your program.
0 comments