Detecting USB insertion/Removal in C++ non-GUI application Detecting USB insertion/Removal in C++ non-GUI application windows windows

Detecting USB insertion/Removal in C++ non-GUI application


Create a message-only window. Despite the name, it's really only a message queue.


#define ANSI#define WIN32_LEAN_AND_MEAN#define _WIN32_WINNT   0x0501#include <windows.h>#include <winuser.h>#include <Dbt.h>#include <string>#include <iostream>#include <stdexcept>#define HID_CLASSGUID {0x4d1e55b2, 0xf16f, 0x11cf,{ 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}}#define CLS_NAME "DUMMY_CLASS"#define HWND_MESSAGE     ((HWND)-3)LRESULT message_handler(HWND__* hwnd, UINT uint, WPARAM wparam, LPARAM lparam){    switch (uint)    {    case WM_NCCREATE: // before window creation        return true;        break;    case WM_CREATE: // the actual creation of the window    {        // you can get your creation params here..like GUID..        LPCREATESTRUCT params = (LPCREATESTRUCT) lparam;        GUID InterfaceClassGuid = *((GUID*)params->lpCreateParams);        DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;        ZeroMemory(&NotificationFilter, sizeof(NotificationFilter));        NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);        NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;        NotificationFilter.dbcc_classguid = InterfaceClassGuid;        HDEVNOTIFY dev_notify = RegisterDeviceNotification(hwnd, &NotificationFilter,                                                           DEVICE_NOTIFY_WINDOW_HANDLE);        if(dev_notify == NULL)        {            throw std::runtime_error("Could not register for devicenotifications!");        }        break;    }    case WM_DEVICECHANGE:    {        PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR) lparam;        PDEV_BROADCAST_DEVICEINTERFACE lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE) lpdb;        std::string path;        if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)        {            path = std::string(lpdbv->dbcc_name);            switch (wparam)            {            case DBT_DEVICEARRIVAL:                std::cout << "new device connected: " << path << "\n";                break;            case DBT_DEVICEREMOVECOMPLETE:                std::cout << "device disconnected: " << path << "\n";                break;            }        }        break;    }    }    return 0L;}int main(int argc, char* argv[]){    HWND hWnd = NULL;    WNDCLASSEX wx;    ZeroMemory(&wx, sizeof(wx));    wx.cbSize = sizeof(WNDCLASSEX);    wx.lpfnWndProc = reinterpret_cast<WNDPROC>(message_handler);    wx.hInstance = reinterpret_cast<HINSTANCE>(GetModuleHandle(0));    wx.style = CS_HREDRAW | CS_VREDRAW;    wx.hInstance = GetModuleHandle(0);    wx.hbrBackground = (HBRUSH)(COLOR_WINDOW);    wx.lpszClassName = CLS_NAME;    GUID guid = HID_CLASSGUID;    if (RegisterClassEx(&wx))    {        hWnd = CreateWindow(CLS_NAME, "DevNotifWnd", WS_ICONIC,                            0, 0, CW_USEDEFAULT, 0, HWND_MESSAGE,                            NULL, GetModuleHandle(0), (void*)&guid);    }    if(hWnd == NULL)    {        throw std::runtime_error("Could not create message window!");    }    std::cout << "waiting for new devices..\n";    MSG msg;    while (GetMessage(&msg, NULL, 0, 0))    {        TranslateMessage(&msg);        DispatchMessage(&msg);    }    return 0;}

This simple program creates a non-visible window and its message handler also receives notifications for 'RegisterDeviceNotification'.


External USB Storage Device Detector


This simple C++ code can detect any pen drive, memory card & external hard drive-

#include <stdio.h>#include <time.h>#include <windows.h>#include <string>using namespace std;string allDrives;char getRemovableDisk();int main(void) {    char driveLetter = getRemovableDisk();    while (1) {        driveLetter = getRemovableDisk();        if (driveLetter != '0') {            printf("%c \n", driveLetter);        }        Sleep(1000);    }    return 0;}char getRemovableDisk() {    char drive = '0';    char szLogicalDrives[MAX_PATH];    DWORD dwResult = GetLogicalDriveStrings(MAX_PATH, szLogicalDrives);    string currentDrives = "";    //cout << dwResult << endl;    for (int i = 0; i < dwResult; i++) {        if (szLogicalDrives[i] > 64 && szLogicalDrives[i] < 90) {            currentDrives.append(1, szLogicalDrives[i]);            if (allDrives.find(szLogicalDrives[i]) > 100) {                drive = szLogicalDrives[i];            }        }    }    allDrives = currentDrives;    return drive;}

PS: This code snippet can detect the insertion of one new USB storage device for Windows OS. If multiple devices are inserted simultaneously in 1 second then only one will be detected. But, of course, you can achieve multiple detections too with a little code change. :)