常见的GUID
在 Windows 操作系统中,设备类型通常使用设备接口 GUID(Globally Unique Identifier,全局唯一标识符)来标识和分类。
以下是一些常见的 Windows 设备类型:
GUID_DEVINTERFACE_USB_DEVICE
:USB 设备类型,包括 USB 存储设备、USB 打印机、USB 鼠标键盘等 USB 设备。GUID_DEVINTERFACE_COMPORT
:串口设备类型,包括通过串口连接的设备,如串口打印机、串口传感器、串口通信设备等。GUID_DEVINTERFACE_DISK
:磁盘设备类型,包括硬盘、固态硬盘、光驱等存储设备。GUID_DEVINTERFACE_NET
:网络设备类型,包括以太网网卡、Wi-Fi 网卡、蓝牙网卡等网络设备。GUID_DEVINTERFACE_DISPLAY_ADAPTER
:显示适配器设备类型,包括显卡和图形处理器。GUID_DEVINTERFACE_PRINTQUEUE
:打印队列设备类型,包括打印机和打印机驱动程序。GUID_DEVINTERFACE_AUDIO_CAPTURE
和GUID_DEVINTERFACE_AUDIO_RENDER
:音频设备类型,包括麦克风、扬声器、音频接口等。GUID_DEVINTERFACE_IMAGE
:图像设备类型,包括摄像头、扫描仪等图像设备。GUID_DEVINTERFACE_BATTERY
:电池设备类型,包括笔记本电脑电池、UPS(不间断电源系统)等电源设备。
监听设备变动
在C++中,可以使用Windows API提供的函数来监听Windows设备的变化。
- 使用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消息到指定的窗口句柄,从而可以在窗口的消息处理函数中处理设备变化事件。
- 使用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的值来判断设备的插入或移除事件,并进行相应的处理。
后记
如果你喜欢我的内容, 请关注我的微信公众号:
或者加入微信群, 一起交流学习。
评论区