英創公司ARM9系列工控主板預裝正版WinCE操作系統,提供標準USB接口,本文介紹如何在應用程序中判斷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;
}
-
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35613
發布評論請先 登錄
相關推薦
評論