问者:sumoyu() 信誉:100 级别:user1 日期:2006-10-13 10:12:51
监测到USB的插入或移出,得到盘符; 事件WM_DEVICECHANGE可以监测到插入和移除,如何判断是插入还是移除,以及如何取盘符
回复:
答者:FFSB(搞点小资) 信誉:100 级别:user2 日期:2006-10-13 11:07:49 id:37208771
Form1::OnCreate //================Dev Notfi============================ DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) ); NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; NotificationFilter.dbcc_classguid = g_UsbioID; DevNotify = RegisterDeviceNotification( Handle, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE ); ========================== //--------------------------------------------------------------------------- void __fastcall TDCForm::WMDeviceChange(TMessage & Msg) { if(Msg.WParam == DBT_DEVICEARRIVAL) { PDEV_BROADCAST_HDR hDev = (PDEV_BROADCAST_HDR)Msg.LParam; if(hDev->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { // Do nothing! } } else if(Msg.WParam == DBT_DEVICEREMOVECOMPLETE) { PDEV_BROADCAST_HDR hDev = (PDEV_BROADCAST_HDR)Msg.LParam; if(hDev->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { if(DisconnBtn->Enabled) { DisconnBtn->Click(); } } } }
答者:FFSB(搞点小资) 信誉:100 级别:user2 日期:2006-10-13 11:09:09 id:37208826
上面抄得有点乱,将就看
答者:sumoyu() 信誉:100 级别:user1 日期:2006-10-13 11:12:45 id:37208961
多谢!我试试
答者:sumoyu() 信誉:100 级别:user1 日期:2006-10-13 11:21:04 id:37209265
g_UsbioID是什么?
答者:FFSB(搞点小资) 信誉:100 级别:user2 日期:2006-10-13 11:51:19 id:37210214
USB硬件ID,
答者:sumoyu() 信誉:100 级别:user1 日期:2006-10-13 12:42:52 id:37211248
如何来得到硬件ID? 我在调试时,跟踪发现插、拔USB硬盘后,Msg.WParam = DBT_DEVNODES_CHANGED
答者:FFSB(搞点小资) 信誉:100 级别:user2 日期:2006-10-13 14:00:41 id:37213378
DEVICE_NOTIFY_WINDOW_HANDLE ==> DEVICE_NOTIFY_WINDOW_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES 就可以跟踪所有USB设备了
答者:cczlp(不惑) 信誉:117 级别:star2 日期:2006-10-13 14:01:41 id:37213414
当Msg.WParam = DBT_DEVNODES_CHANGED时, 取指定设备的个数,增加就是插入,减少就是移除。
答者:sumoyu() 信誉:100 级别:user1 日期:2006-10-13 15:05:05 id:37215482
拔去USB后会产生一个事件Msg.WParam == DBT_DEVICEREMOVECOMPLETE,另外还会产生一个事件 Msg.WParam = DBT_DEVNODES_CHANGED。拔去USB后,这两个事件下的代码都得到执行(好像是Msg.WParam = DBT_DEVNODES_CHANGED先执行的。) 另外请教能不能用一个函数得到所有USB的GUID。
答者:FFSB(搞点小资) 信誉:100 级别:user2 日期:2006-10-13 15:31:02 id:37216498
SetupDIxxxxx具题名字忘了,你查一下
好吧,上面的都是扯淡,看大师力作吧:
http://www.codeproject.com/Articles/14500/Detecting-Hardware-Insertion-and-or-Removal
http://www.codeproject.com/Articles/119168/Hardware-Change-Detection
通常传入的RegisterDeviceNotification->GUID不是你想象的那样,这是有讲究的,看这篇博客:
http://blogs.msdn.com/b/doronh/archive/2006/02/15/532679.aspx