英創(chuàng)公司ARM9系列工控主板預(yù)裝正版WinCE操作系統(tǒng),提供標準USB接口,本文介紹如何在應(yīng)用程序中判斷USB存儲設(shè)備的插入和移出操作。
方法一:思路是在應(yīng)用程序創(chuàng)建一個線程,在線程里循環(huán)定時查詢系統(tǒng)中是否存在USB存儲設(shè)備,可以通過讀取系統(tǒng)注冊表或調(diào)用 API函數(shù)來實現(xiàn),下面是通過API函數(shù)查詢USB存儲設(shè)備的程序片段。
STOREINFO StoreInfo;
hDevice = FindFirstStore( &StoreInfo );
if( INVALID_HANDLE_VALUE != hDevice )
{
do
{
// 判斷是否為USB存儲設(shè)備
if( 0 == _tcscmp( StoreInfo.szStoreName, _T(‘USB Hard Disk Drive’) ) )
{
// 如果查找到USB存儲設(shè)備,則打印信息到調(diào)試串口
RETAILMSG( 1, (TEXT(‘USB%shas been inserted\n’ ) ,
StoreInfo.szDeviceName ));
}
}while( FindNextStore( hDevice, &StoreInfo ) );
}
方法二:上面的方法在效率和實時性方面都不能令人滿意,通常只用作檢測U盤是否已接入到系統(tǒng)中,如果要實時的檢測U盤的插入,移出操作,推薦使用下面提出的方法。
當USB設(shè)備插入或從系統(tǒng)中移出時,系統(tǒng)會產(chǎn)生WM_DEVICECHANGE消息,應(yīng)用程序只需要處理這個消息就可以方便的判斷U盤的插入和移出操作,我們需要關(guān)心WM_DEVICECHANGE消息wParam參數(shù)的兩個取值:
DBT_DEVICEARRIVAL // 設(shè)備插入
DBT_DEVICEREMOVECOMPLETE // 設(shè)備移出
(WM_DEVICECHANGE消息更詳細的信息,請參考MSDN WM_DEVICECHANGE Message http://msdn.microsoft.com/en-us/library/aa363480(VS.85).aspx)
值得注意的是當網(wǎng)絡(luò)設(shè)備插入和移出時,也會觸發(fā)這個消息,這樣就會對判斷是否為USB設(shè)備產(chǎn)生影響,不過,在WM_DEVICECHANGE消息的lParam參數(shù)中保存了設(shè)備的相關(guān)信息,對設(shè)備類型進行判斷,只需要獲得DEV_BROADCAST_VOLUME結(jié)構(gòu)中的dbcv_flags的值,當它的值為DBTF_INET時,表示產(chǎn)生此消息的設(shè)備是網(wǎng)絡(luò)設(shè)備,它的值等于DBTF_MEDIA時,表示產(chǎn)生消息的是媒體設(shè)備。對WM_DEVICECHANGE消息了解后,就可以利用它,在程序中實時檢測USB設(shè)備的插入和移出了。下面是節(jié)略的程序片段。
// 窗口回調(diào)函數(shù)中,當系統(tǒng)消息為WM_DEVICECHANGE時,調(diào)用此函數(shù)
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存儲設(shè)備
{
switch( wParam )
{
case DBT_DEVICEARRIVAL: // USB存儲設(shè)備插入
RETAILMSG(1, (TEXT( ‘USBDisk%c is inserted\n’), dbvDev-》dbcv_name[0]));
break;
case DBT_DEVICEREMOVECOMPLETE: // USB存儲設(shè)備移出
RETAILMSG( 1, (TEXT( ‘USBDisk%c is remove\n’), dbvDev-》dbcv_name[0] ));
break;
}
}
return 0;
}
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35336
發(fā)布評論請先 登錄
相關(guān)推薦
評論