实时获得硬件被拔掉的消息,并在程序中弹出提示框。
我知道获得系统的WM_DEVICECHANGE的消息。
在函数OnDeviceChange(){}
中实现,可是如何判断硬件已经被拔掉?谢谢!

解决方案 »

  1.   

    我已经调用了setupDiEnumDeviceInfoList函数
    可是出现了一些问题;
    1:在Win2000下有时系统重起
    2:在windows me下操作a:盘时程序非法操作
    2:在winnt下有时系统不支持。
    能否帮忙说详细点?谢谢!
      

  2.   

    我已经调用了setupDiEnumDeviceInfoList函数
    可是出现了一些问题;
    1:在Win2000下有时系统重起
    2:在windows me下操作a:盘时程序非法操作
    2:在winnt下有时系统不支持。
    能否帮忙说详细点?谢谢!
    我刚写了类似的程序,没有什么问题啊http://expert.csdn.net/Expert/topic/2247/2247211.xml?temp=.7121088
      

  3.   

    http://expert.csdn.net/Expert/topic/2247/2247211.xml?temp=.7121088
    把上面贴子的代码中
    if(!SetupDiClassGuidsFromName("Ports",ab,i,&i))//通过设备类名得到设备类型的GUID
    改成
    if(!SetupDiClassGuidsFromName("USB",ab,i,&i))//通过设备类名得到设备类型的GUID
    就能用了
      

  4.   

    MSDN上的例子
    #include <windows.h>
    #include <dbt.h>char FirstDriveFromMask (ULONG unitmask);  //prototype/*------------------------------------------------------------------
       Main_OnDeviceChange (hwnd, wParam, lParam)   Description
          Handles WM_DEVICECHANGE messages sent to the application's
          top-level window.
    --------------------------------------------------------------------*/void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
    {
       PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
       char szMsg[80];   switch(wParam)
       {
          case DBT_DEVICEARRIVAL:
             // Check whether a CD or DVD was inserted into a drive.
             if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
             {
                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;            if (lpdbv -> dbcv_flags & DBTF_MEDIA)
                {
                   wsprintf (szMsg, "Drive %c: Media has arrived.\n",
                             FirstDriveFromMask(lpdbv ->dbcv_unitmask));               MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
                }
             }
             break;      case DBT_DEVICEREMOVECOMPLETE:
             // Check whether a CD or DVD was removed from a drive.
             if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
             {
                PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;            if (lpdbv -> dbcv_flags & DBTF_MEDIA)
                {
                   wsprintf (szMsg, "Drive %c: Media was removed.\n",
                             FirstDriveFromMask(lpdbv ->dbcv_unitmask));               MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
                }
             }
             break;      default:
               /*
                  Process other WM_DEVICECHANGE notifications for other 
                  devices or reasons.
               */ 
                ;
       }
    }/*------------------------------------------------------------------
       FirstDriveFromMask (unitmask)   Description
          Finds the first valid drive letter from a mask of drive letters. 
          The mask must be in the format bit 0 = A, bit 1 = B, bit 3 = C, 
          etc. A valid drive letter is defined when the corresponding bit 
          is set to 1.   Returns the first drive letter that was found.
    --------------------------------------------------------------------*/ char FirstDriveFromMask (ULONG unitmask)
    {
       char i;   for (i = 0; i < 26; ++i)
       {
          if (unitmask & 0x1)
             break;
          unitmask = unitmask >> 1;
       }   return (i +
      

  5.   

    afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );
       然后在代码中处理如下:
       BOOL CDevDlg::OnDeviceChange( UINT nEventType, DWORD dwData )
        {
            
               switch(nEventType)
         {
                    case DBT_DEVICEARRIVAL:
               {
                               //处理到达消息,
          MessageBox("arrival");
         bDeviceArrive = TRUE; 
                              
                         }
                         break;
       
                   case DBT_DEVICEREMOVECOMPLETE:

                             //处理拔除消息,    
                               MessageBox("Remove");
         bDeviceArrive = FALSE;
                    bDeviceRemove = TRUE; 
                              
               }
                        break;
                     
      }
              
    return TRUE;
        }
      

  6.   

    如果你的硬件在系统中认出来是u盘之类的东西的话,根本不需要这么麻烦,shell就可以做到。用shell32.dll中的两个未公开api,可以监视到shell级和文件系统级的事件,譬如文件创建,删除,更名,文件夹创建删除,移动介质的插入和拔除。
    如果不是这样,那稍微麻烦点,就上面诸位的方法可以。枚举设备接口。ddk里头有例子的。