今天一位老兄要我?guī)兔ψ鲆粋€(gè)軟件,需要把在U盤插入U(xiǎn)SB接口激活之后自動(dòng)把U盤里的內(nèi)容拷貝到硬上。拷貝文件不難,麻煩的就是不知道怎么檢測(cè)U盤是否激活,激活后又是哪個(gè)盤符。
google了一下,在MSDN上看了幾個(gè)例子,找到了檢測(cè)U盤插入,并確定其盤符的方法。
下面給出窗口的回調(diào)函數(shù):
?1?LRESULT?CALLBACK?WndProc?(HWND?hWnd,?UINT?message,?WPARAM?wParam,?LPARAM?lParam)
?2?
?3?{
?4?????
?5?????switch?(message)?
?6?????{
?7?????????
?8?????case?WM_CREATE:/*初始化*/
?9?????????
10?????????MessageBox(hWnd,?"go!",?"405?Studio",?MB_OK);
11?????????
12?????????break;
13?????????
14?????case?WM_DEVICECHANGE:
15?????????
16?????????if(wParam?==?DBT_DEVICEARRIVAL)?//設(shè)備激活
17?????????{
18?????????????PDEV_BROADCAST_HDR?lpdb?=?(PDEV_BROADCAST_HDR)lParam;
19?????????????
20?????????????PDEV_BROADCAST_VOLUME?lpdbv?=?(PDEV_BROADCAST_VOLUME)lpdb;
21?????????????
22?????????????char?szMsg[80];
23?????????????wsprintf?(szMsg,?"Drive?%c:?Media?has?arrived.\n",
24?????????????????FirstDriveFromMask(lpdbv?->dbcv_unitmask));
25?????????????
26?????????????MessageBox?(hWnd,?szMsg,?"WM_DEVICECHANGE",?MB_OK);
27?????????????
28?????????}
29?????????
30?????????break;
31?????????
32?????default:
33?????????return?DefWindowProc?(hWnd,?message,?wParam,?lParam)?;
34?????}
35?????
36?????return?0;
37?????
38?}
原理很簡單檢測(cè)U盤是否被插入是通過監(jiān)聽
WM_DEVICECHANGE消息來實(shí)現(xiàn)的。18,19行是從WM_DEVICECHANGE的lParam里獲取盤符。
FirstDriveFromMask是一個(gè)用返回盤符(A,B,C ....)的簡單函數(shù)
?1?char?FirstDriveFromMask?(ULONG?unitmask)
?2?{
?3?????char?i;
?4?????
?5?????for?(i?=?0;?i?<?26;?++i)
?6?????{
?7?????????if?(unitmask?&?0x1)
?8?????????????break;
?9?????????unitmask?=?unitmask?>>?1;
10?????}
11?????
12?????return?(i?+?'A');
13?}