常见的GUID

在 Windows 操作系统中,设备类型通常使用设备接口 GUID(Globally Unique Identifier,全局唯一标识符)来标识和分类。

以下是一些常见的 Windows 设备类型:

  1. GUID_DEVINTERFACE_USB_DEVICE:USB 设备类型,包括 USB 存储设备、USB 打印机、USB 鼠标键盘等 USB 设备。
  2. GUID_DEVINTERFACE_COMPORT:串口设备类型,包括通过串口连接的设备,如串口打印机、串口传感器、串口通信设备等。
  3. GUID_DEVINTERFACE_DISK:磁盘设备类型,包括硬盘、固态硬盘、光驱等存储设备。
  4. GUID_DEVINTERFACE_NET:网络设备类型,包括以太网网卡、Wi-Fi 网卡、蓝牙网卡等网络设备。
  5. GUID_DEVINTERFACE_DISPLAY_ADAPTER:显示适配器设备类型,包括显卡和图形处理器。
  6. GUID_DEVINTERFACE_PRINTQUEUE:打印队列设备类型,包括打印机和打印机驱动程序。
  7. GUID_DEVINTERFACE_AUDIO_CAPTUREGUID_DEVINTERFACE_AUDIO_RENDER:音频设备类型,包括麦克风、扬声器、音频接口等。
  8. GUID_DEVINTERFACE_IMAGE:图像设备类型,包括摄像头、扫描仪等图像设备。
  9. GUID_DEVINTERFACE_BATTERY:电池设备类型,包括笔记本电脑电池、UPS(不间断电源系统)等电源设备。

监听设备变动

在C++中,可以使用Windows API提供的函数来监听Windows设备的变化。

  1. 使用RegisterDeviceNotification函数注册设备通知:
#include <iostream>
#include <Windows.h>

int main()
{
    // 定义设备通知过滤器
    DEV_BROADCAST_DEVICEINTERFACE filter;
    ZeroMemory(&filter, sizeof(filter));
    filter.dbcc_size = sizeof(filter);
    filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    filter.dbcc_classguid = <设备类GUID>;

    // 注册设备通知
    HDEVNOTIFY hDevNotify = RegisterDeviceNotification(
        <窗口句柄>,
        &filter,
        DEVICE_NOTIFY_WINDOW_HANDLE
    );
    if (hDevNotify == NULL)
    {
        std::cout << "Failed to register device notification: " << GetLastError() << std::endl;
        return 1;
    }

    // 进入消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // 注销设备通知
    UnregisterDeviceNotification(hDevNotify);

    return 0;
}

在以上代码中,通过调用RegisterDeviceNotification函数注册了设备通知,指定了设备类GUID和窗口句柄。当设备插入或移除时,系统会发送WM_DEVICECHANGE消息到指定的窗口句柄,从而可以在窗口的消息处理函数中处理设备变化事件。

  1. 使用Windows消息处理函数处理WM_DEVICECHANGE消息:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_DEVICECHANGE)
    {
        PDEV_BROADCAST_HDR pBroadcastHdr = reinterpret_cast<PDEV_BROADCAST_HDR>(lParam);
        if (pBroadcastHdr != NULL)
        {
            switch (wParam)
            {
                case DBT_DEVICEARRIVAL:
                    // 处理设备插入事件
                    break;
                case DBT_DEVICEREMOVECOMPLETE:
                    // 处理设备移除事件
                    break;
                default:
                    break;
            }
        }
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

在以上代码中,通过在Windows消息处理函数中处理WM_DEVICECHANGE消息,可以根据wParam的值来判断设备的插入或移除事件,并进行相应的处理。

后记

如果你喜欢我的内容, 请关注我的微信公众号:

或者加入微信群, 一起交流学习。

image-20230423125404712