今天一位老兄要我帮忙做一个软件,需要把在U盘插入USB接口激活之后自动把U盘里的内容拷贝到硬上。拷贝文件不难,麻烦的就是不知道怎么检测U盘是否激活,激活后又是哪个盘符。
google了一下,在MSDN上看了几个例子,找到了检测U盘插入,并确定其盘符的方法。
下面给出窗口的回调函数:
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) //设备激活
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 }
原理很简单检测U盘是否被插入是通过监听
WM_DEVICECHANGE消息来实现的。18,19行是从WM_DEVICECHANGE的lParam里获取盘符。
FirstDriveFromMask是一个用返回盘符(A,B,C ....)的简单函数
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 }