本帖最后由 usualwyy 于 2009-08-31 05:03:45 编辑

解决方案 »

  1.   

    用RegisterDeviceNotification注册一个通知窗口
      

  2.   

    Private Declare Function CallWindowProc Lib "user32" _
        Alias "CallWindowProcA" _
       (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, _
         ByVal Msg As Long, ByVal wParam As Long, _
         ByVal lParam As Long) As LongPrivate Declare Function SetWindowLong Lib "user32" _
       Alias "SetWindowLongA" _
      (ByVal hWnd As Long, ByVal nIndex As Long, _
       ByVal wNewWord As Long) As LongPrivate Const GWL_WNDPROC                As Long = (-4)
    Private Const DBT_DEVICEARRIVAL          As Long = 32768
    Private Const DBT_DEVICEREMOVECOMPLETE   As Long = 32772
    Private Const DBT_DEVTYP_VOLUME          As Long = &H2
    Public Const WM_CLOSE                   As Long = &H10
    Private Const WM_DEVICECHANGE            As Long = &H219Public DeviceCallBack           As LongPublic Sub StartUSBWatch(ByVal hWnd As Long)
        DeviceCallBack = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf OnDeviceChange)
    End SubPublic Sub StopUSBWatch(ByVal hWnd As Long)
        DeviceCallBack = SetWindowLong(hWnd, GWL_WNDPROC, DeviceCallBack)
    End SubPublic Function OnDeviceChange(ByVal hWnd As Long, _
        ByVal Msg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long
        
        If Msg = WM_DEVICECHANGE Then
            '在这里处理
        End If
        OnDeviceChange = CallWindowProc(DeviceCallBack, hWnd, Msg, wParam, lParam)
    End Function
      

  3.   

    MSDN有现成的例子...
    http://msdn.microsoft.com/en-us/library/aa363432(VS.85).aspx
      

  4.   

    我用的是四楼的方法,但是太勉强,太迫不得已了,If Msg = WM_DEVICECHANGE之后不做判断带来的结果就是鼠标拔出或者插入会触发若干次,估计是鼠标拔掉影响了USB HOST造成的配置改变。。