DEV_BROADCAST_DEVICEINTERFACE (转)

在Windows系统中当设备被插入/拔出的时候,WINDOWS会向
应用程序的主窗口发送WM—DEVICECHANGE消息,通知设备状态
改变.若要获得某个或某类指定设备的状态变化,程序初始化过程
中需要调用RegisterDeviceNotification向系统注册以获得消息通知. 

RegisterDeviceN0ti6cation(

inHANDLEhRecipient,
inLPVOIDNotificationFilter,
inDWORDFlags);
ResterDeviceNotification作用是获得某类设备状态改变的通
知,
其中函数参数Notificati0nFilter是DEV_BROADCAST_DEVI—
CEINTERFACE—
A类型结构体,表明程序需要监听哪类设备的消

 

DEV_BROADCAST_DEVICEINTERFACE structure

4 out of 7 rated this helpful - Rate this topic

Contains information about a class of devices.

Syntax

C++
 typedef struct _DEV_BROADCAST_DEVICEINTERFACE { DWORD dbcc_size; DWORD dbcc_devicetype; DWORD dbcc_reserved; GUID  dbcc_classguid; TCHAR dbcc_name[1]; } DEV_BROADCAST_DEVICEINTERFACE, *PDEV_BROADCAST_DEVICEINTERFACE;

Members

dbcc_size

The size of this structure, in bytes. This is the size of the members plus the actual length of the dbcc_name string (the null character is accounted for by the declaration ofdbcc_name as a one-character array.)

dbcc_devicetype   表示设备的类型,

Set to DBT_DEVTYP_DEVICEINTERFACE.

dbcc_reserved

Reserved; do not use.

dbcc_classguid 表示设备的GUID,

The GUID for the interface device class.

dbcc_name e表示设备名称.我们需要通过Windows的设备管
理器查找被监控设备的硬件ID,根据ID在注册表中查找该类设备
GUID的值,当注册设备状态消息时将结构体中dbcc_classguid设置
为该值.

A null-terminated string that specifies the name of the device.

When this structure is returned to a window through the WM_DEVICECHANGE message, the dbcc_name string is converted to ANSI as appropriate. Services always receive a Unicode string, whether they call RegisterDeviceNotificationW or RegisterDeviceNotificationA.

2_3消息处理部分的实现
当系统发送WM—DEVICECHANGE消息时会发送两个参数
(wParam,1Param).其中,wParam表示设备状态发生了何种变化.

当wParam=DBT_DEVICEARRIVAL时,表示设备已经插入并且可用;

当wParam=DBT_DEVICEREMOVECOMPLETE时,则表示表示设备
已经成功移出.

 

当wParam等于以上两个值时,参数1Param是一个
指向DEV—BROADCAST_HDR结构的指针,其原型为:
typedefstruct——
DEV_ BROADCAST—— HDR
{
DWORDdbch_size://结构体所占字节数,
DWORDdbch_devicetype;//设备类型
DWORDdbch_ reserved;
JDEV—BROADCAST—HDR
收到WM—DEVICECHANGE消息后程序需要对消息进行近 
步处理,我们需要根据结构体一DEV_BROADCAST—HDR中
dbch~devicetype的值来确定设备类型,dbch—devicetype的取值一般

如下:
DBT_ DEVTYP_ DEvICEINTERFACE:表明为某类设备接口.
DB_ DEVTYP—HANDLE:文件系统句柄.
DB— DEVTYP_ OEM:OEM或IHV厂商自定义设定的设备类
型.
DB_ DEVTYP_PPOTR:端El设备(串行或并行).
DBT_ DEVTYP—VOLUME:逻辑磁盘盘卷.
当dbch_ devicetype=DBT_ DEVTYP_DEVICEINTERFACE时表
明1Param是指向消息结构体DEV—BROADCAST_DEVIcEINTER—
FACE—A的指针,在本系统中我们主要关心此类信息.程序接收到
WM_DEVICECHANGE消息后需要根据wParam的值对1Param消息
进行近一步处理.代码如下:
BOOLOnDeviceChange(WPARAMwParam,LPARAM1Param)
{
iffDBT_
DEVICEARRIVAL==wParamllDBT_
DEVICERE—
M0VECOMPLETE==wParam){
PDEV_BROADCAST_HDRpHdr=(PDEV—BROAD-
CAST_HDR)lParam;

switch(pHdr一>dbch—devicetype)
{
caseDBT_
DEVTYP_
DEVICEINTERFACE
ManageDevice(pHdr,wParam);
break;
}
l
retumTRUE;
l
我们根据dbcc_name的值可以获得硬件的ID(如
USB\VID一
1687&PID_6211),由硬件ID通过调用微软的SetupApi函
数可以获得设备的类(device_type),由此我们可以判定此类设备
是否需要禁止使用,主要代码如下:
Switch(device—type)
{
CaseDEVINTERFACE—
DISK://USB存储设备
Break;
CaseDEVINTERFACE—
USB—DEVICE://其他USB设备
Break;

在C++中,检测U盘插入并不是语言本身直接提供的功能,通常需要依赖操作系统提供的API。以Windows为例,可以使用Windows的设备通知机制(RegisterDeviceNotification API)来接收系统通知,当U盘等移动存储设备插入时,系统会发送一个通知消息。 以下是一个简单的C++示例代码,展示如何使用Windows API在Windows平台上检测U盘插入: ```cpp #include <windows.h> #include <dbt.h> // 定义一个用于接收通知消息的回调函数 LRESULT CALLBACK NotifyFunc(WPARAM wParam, LPARAM lParam) { DEV_BROADCAST_HDR* dbh = (DEV_BROADCAST_HDR*)lParam; if (dbh->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { DEV_BROADCAST_DEVICEINTERFACE* dbdi = (DEV_BROADCAST_DEVICEINTERFACE*)dbh; // 在这里处理设备插入事件 MessageBox(NULL, L"U盘插入了!", L"设备通知", MB_OK); } return TRUE; } int main() { // 使用WM_DEVICECHANGE消息注册一个通知窗口 HWND hwnd = CreateWindow(L"STATIC", L"DeviceNotificationWindow", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL); WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = DefWindowProc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = L"DeviceNotificationWindowClass"; RegisterClassEx(&wc); // 填充DEV_BROADCAST_DEVICEINTERFACE结构体并注册 DEV_BROADCAST_DEVICEINTERFACE notificationFilter = {0}; notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; // 这里可以指定特定设备的GUID,如果你想监听特定类型的设备 HDEVNOTIFY hDevNotify = RegisterDeviceNotification(hwnd, &notificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); if (!hDevNotify) { // 注册失败处理 MessageBox(NULL, L"注册设备通知失败!", L"错误", MB_ICONERROR); return 1; } // 进入消息循环 MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)) { if (msg.message == WM_DEVICECHANGE) { NotifyFunc(msg.wParam, msg.lParam); } } // 清理 UnregisterDeviceNotification(hDevNotify); DestroyWindow(hwnd); return 0; } ``` 这段代码创建了一个隐藏的窗口,用于接收设备通知消息,并在U盘插入时弹出消息框。这里使用了`RegisterDeviceNotification`函数来注册设备通知。 需要注意的是,编写这样的代码需要有Windows开发环境,并且需要处理很多细节问题,例如消息循环的管理,以及错误处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值