如何实现WinCE系统中USB设备自动检测
2010-12-03 11:59
549 查看
本文介绍如何在应用程序中判断USB存储设备的插入和移出操作。
方法一:思路是在应用程序创建一个线程,在线程里循环定时查询系统中是否存在USB存储设备,可以通过读取系统注册表或调用 API函数来实现,下面是通过API函数查询USB存储设备的程序片段。
STOREINFO StoreInfo;
hDevice = FindFirstStore( &StoreInfo );
if( INVALID_HANDLE_VALUE != hDevice )
{
do
{
//判断是否为USB存储设备
if( 0 == _tcscmp( StoreInfo.szStoreName, _T('USB Hard Disk Drive') ) )
{
//如果查找到USB存储设备,则打印信息到调试串口
RETAILMSG( 1, (TEXT('USB%shas been inserted/n' ) ,
StoreInfo.szDeviceName ));
}
}while( FindNextStore( hDevice, &StoreInfo ) );
}
方法二:上面的方法在效率和实时性方面都不能令人满意,通常只用作检测U盘是否已接入到系统中,如果要实时的检测U盘的插入,移出操作,推荐使用下面提出的方法。
当USB设备插入或从系统中移出时,系统会产生WM_DEVICECHANGE消息,应用程序只需要处理这个消息就可以方便的判断U盘的插入和移出操作,我们需要关心WM_DEVICECHANGE消息wParam参数的两个取值:
DBT_DEVICEARRIVAL //设备插入
DBT_DEVICEREMOVECOMPLETE //设备移出
(WM_DEVICECHANGE消息更详细的信息,请参考MSDN WM_DEVICECHANGE Message http://msdn.microsoft.com/en-us/library/aa363480(VS.85).aspx)
值得注意的是当网络设备插入和移出时,也会触发这个消息,这样就会对判断是否为USB设备产生影响,不过,在WM_DEVICECHANGE消息的lParam参数中保存了设备的相关信息,对设备类型进行判断,只需要获得DEV_BROADCAST_VOLUME结构中的dbcv_flags的值,当它的值为DBTF_INET时,表示产生此消息的设备是网络设备,它的值等于DBTF_MEDIA时,表示产生消息的是媒体设备。对WM_DEVICECHANGE消息了解后,就可以利用它,在程序中实时检测USB设备的插入和移出了。下面是节略的程序片段。
//窗口回调函数中,当系统消息为WM_DEVICECHANGE时,调用此函数
LRESULT USBDetect( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
PDEV_BROADCAST_VOLUME dbvDev = (PDEV_BROADCAST_VOLUME)lParam;
if( dbvDev->dbcv_flags & DBTF_MEDIA ) //判断是否为USB存储设备
{
switch( wParam )
{
case DBT_DEVICEARRIVAL: //USB存储设备插入
RETAILMSG(1, (TEXT( 'USBDisk%c is inserted/n'), dbvDev->dbcv_name[0]));
break;
case DBT_DEVICEREMOVECOMPLETE: //USB存储设备移出
RETAILMSG( 1, (TEXT( 'USBDisk%c is remove/n'), dbvDev->dbcv_name[0] ));
break;
}
}
return 0;
}
方法一:思路是在应用程序创建一个线程,在线程里循环定时查询系统中是否存在USB存储设备,可以通过读取系统注册表或调用 API函数来实现,下面是通过API函数查询USB存储设备的程序片段。
STOREINFO StoreInfo;
hDevice = FindFirstStore( &StoreInfo );
if( INVALID_HANDLE_VALUE != hDevice )
{
do
{
//判断是否为USB存储设备
if( 0 == _tcscmp( StoreInfo.szStoreName, _T('USB Hard Disk Drive') ) )
{
//如果查找到USB存储设备,则打印信息到调试串口
RETAILMSG( 1, (TEXT('USB%shas been inserted/n' ) ,
StoreInfo.szDeviceName ));
}
}while( FindNextStore( hDevice, &StoreInfo ) );
}
方法二:上面的方法在效率和实时性方面都不能令人满意,通常只用作检测U盘是否已接入到系统中,如果要实时的检测U盘的插入,移出操作,推荐使用下面提出的方法。
当USB设备插入或从系统中移出时,系统会产生WM_DEVICECHANGE消息,应用程序只需要处理这个消息就可以方便的判断U盘的插入和移出操作,我们需要关心WM_DEVICECHANGE消息wParam参数的两个取值:
DBT_DEVICEARRIVAL //设备插入
DBT_DEVICEREMOVECOMPLETE //设备移出
(WM_DEVICECHANGE消息更详细的信息,请参考MSDN WM_DEVICECHANGE Message http://msdn.microsoft.com/en-us/library/aa363480(VS.85).aspx)
值得注意的是当网络设备插入和移出时,也会触发这个消息,这样就会对判断是否为USB设备产生影响,不过,在WM_DEVICECHANGE消息的lParam参数中保存了设备的相关信息,对设备类型进行判断,只需要获得DEV_BROADCAST_VOLUME结构中的dbcv_flags的值,当它的值为DBTF_INET时,表示产生此消息的设备是网络设备,它的值等于DBTF_MEDIA时,表示产生消息的是媒体设备。对WM_DEVICECHANGE消息了解后,就可以利用它,在程序中实时检测USB设备的插入和移出了。下面是节略的程序片段。
//窗口回调函数中,当系统消息为WM_DEVICECHANGE时,调用此函数
LRESULT USBDetect( HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
{
PDEV_BROADCAST_VOLUME dbvDev = (PDEV_BROADCAST_VOLUME)lParam;
if( dbvDev->dbcv_flags & DBTF_MEDIA ) //判断是否为USB存储设备
{
switch( wParam )
{
case DBT_DEVICEARRIVAL: //USB存储设备插入
RETAILMSG(1, (TEXT( 'USBDisk%c is inserted/n'), dbvDev->dbcv_name[0]));
break;
case DBT_DEVICEREMOVECOMPLETE: //USB存储设备移出
RETAILMSG( 1, (TEXT( 'USBDisk%c is remove/n'), dbvDev->dbcv_name[0] ));
break;
}
}
return 0;
}
相关文章推荐
- 如何实现WinCE系统中USB设备自动检测
- 树莓派Raspberry Pi实战之命令行下实现USB存储设备自动挂载
- usb转rs232驱动无效,已经电脑自动扫描检测硬件改动.设备无法运行错误代码10
- linux下如何自动检测并重新启动一个死掉的进程,然后再把它杀死:)(shell脚本实现)
- 如何在LINUX下实现硬件的自动检测(上)
- Android 如何实现usb驱动自动安装?
- 树莓派实现USB存储设备自动挂载
- (转) 两种自动检测USB设备的添加和移除的方法
- 如何在LINUX下实现硬件的自动检测(下)
- iOS中如何实现检测苹果设备的类型
- 如何开发板上移植udev并实现移动设备的自动挂载
- USB 设备的自动检测 /proc/bus/usb
- 如何在LINUX下实现硬件的自动检测
- USB如何检测到设备的插入-usb技术入门教程1
- IOS开发中如何实现自动检测更新APP
- 如何在i.mx6dl开发板上移植udev并实现移动设备的自动挂载
- Linux下C语言来检测USB设备以及自动挂载
- WINCE5.0上USB设备的自动检测
- 如何实现USB自动挂载?
- Linux下用Socket检测设备的挂载(实现设备的自动挂载)