Невозможно получить уведомление WM_DEVICECHANGE - PullRequest
1 голос
/ 13 июля 2020

Я хочу получить информацию об объеме вставленного USB-накопителя. Это мой первый winapi, и я мало что знаю о winapi, поэтому, пожалуйста, объясните, что я сделал не так

#include<Windows.h>
#include <Dbt.h>
#include<iostream>
    #define HID_CLASSGUID { 0x53f5630d, 0xb6bf, 0x11d0,{ 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b }}
    static const GUID GuidDevInterfaceList[] = {    
        { 0x53f5630d, 0xb6bf, 0x11d0,{ 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } }
    };



    RegisterListener()
    {
        HWND hWnd = NULL;
        WNDCLASSEXW 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 (RegisterClassExW(&wx))
        {
            hWnd = CreateWindowW(
                CLS_NAME, L"DeviceNotificationWindow", 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 <<std::endl<< "Listening..." << std::endl;
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }   
    }
    
    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
        {
            
            LPCREATESTRUCT params = (LPCREATESTRUCT)lparam;
            GUID InterfaceClassGuid = *((GUID*)params->lpCreateParams);
            DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
            DEV_BROADCAST_VOLUME VolumeNotification;
            
            ZeroMemory(&VolumeNotification, sizeof(VolumeNotification));
            VolumeNotification.dbcv_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
            VolumeNotification.dbcv_size = sizeof(DEV_BROADCAST_VOLUME);
            HDEVNOTIFY dev_volNotify = RegisterDeviceNotification(hwnd, &VolumeNotification, DEVICE_NOTIFY_WINDOW_HANDLE);
            if (dev_volNotify == NULL) {     // Handle the error by returning correct error in LRESULT format and remove throw...   
                std::cout << "Failed to create Handle"<<std::endl;
                std::cout << GetLastError() << std::endl;
            }
     }
        break;
    
        case WM_DEVICECHANGE:
        {
    
            PDEV_BROADCAST_HDR(lpdb) = (PDEV_BROADCAST_HDR)lparam;
            PDEV_BROADCAST_DEVICEINTERFACE_W lpdbv = (PDEV_BROADCAST_DEVICEINTERFACE_W)lpdb;
            TCHAR szMsg[80];
            switch (wparam)
            {
    
                case DBT_DEVICEARRIVAL:     

                    std::cout << "Device Arrived" << std::endl;
                    if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
                    {
                        std::cout << "Volume received";
                    }
                    break;
    
                case DBT_DEVICEREMOVECOMPLETE:
                    std::cout << "Device Removed" << std::endl;
                    break;
            }
            
        }
    
        }
        return 0L;
    }

    int main()
    {
        RegisterListener();
        return 0;
    }

Он никогда не получает никаких уведомлений о вставке или удалении любого USB-устройства. Я хочу получать уведомление с dbch_devicetype == DBT_DEVTYP_VOLUME. Это весь код. Вы можете запустить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...