Public Function WndProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '消息拦截 当有消息时候会在这里出现
    If msg = WM_DEVICECHANGE Then '当消息是 磁盘发生改变
        Select Case Menu
            Case NET_MENU
                DeviceNet.tmrUSB.Enabled = True: DoEvents
            Case LED_MENU
                LEDsignal.tmrConnect.Enabled = True
            Case CH_MENU
                SelectCH.tmrTelCom.Enabled = True: DoEvents
            Case Else
        End Select
    End If    WndProc = CallWindowProcA(lpPrev, hWnd, msg, wParam, lParam) '返回消息给系统否则系统所有消息都被拦截 你的电脑几乎就是废了 关机都不行
End Function'使用定时器的查询来获取是插入,还是拔出。
Private Sub tmrConnect_Timer()      '查检USB状态
    Dim i As Integer
    
    Call ConnectRMC
    If FindTheHid = True Then
        tmrConnect.Enabled = False: DoEvents
        
        Label5.Caption = "请勿移动协调器!"
        Call Led_On(1, GREEN)
        
        tmrData.Enabled = True: DoEvents      '数据收发
    Else
        Label5.Caption = "请接入协调器!"
        If Check(1) = 1 Then
            Call Led_On(1, RED)
        Else
            Call Led_On(1, BLACK)
        End If
        ShowWindow Me.hWnd, SW_RESTORE
        tmrData.Enabled = False: DoEvents
        'tmrConnect.Enabled = True: DoEvents
    End If
End SubVB6获取USB设备的拔出信息每次软件开启的第一次都不灵,什么原因呀?EXE有两个界面,只要我重新打开一下界面,就能捕获USB设备的拔出信息了。但奇怪的是,每次插入都能捕获取哦,这样我很头痛呀……
还有,怎么捕获单单我这个USB设备的消息呀?而不是所有U口发生的消息?

解决方案 »

  1.   


    不需要定时器。直接利用系统的 OnDeviceChange 消息。wParam = DBT_DEVICEREMOVECOMPLETE 就是设备移除。
      

  2.   


    但是每次我USB设备连接或者移除的时候都获取不了“wParam = DBT_DEVICEREMOVECOMPLETE”,这可如何是好呀?跟我USB设备的驱动有关吗?唉,不知道在哪里修改USB设备驱动与连接或者移除有关的源代码,头大……
      

  3.   

    有些自定义设备是得不到参数的,值始终为 0。那就在得到 OnDeviceChange 消息时尝试打开设备。得到设备句柄就是设备上来了,否则就认为设备不存在。
      

  4.   


    哦哦,这个方法好哦,这样就取代了我用定时器去打开句柄了?
    '使用定时器的查询来获取是插入,还是拔出。
    Private Sub tmrConnect_Timer()      '查检USB状态
        Dim i As Integer
        
        Call ConnectRMC
        If FindTheHid = True Then
            tmrConnect.Enabled = False: DoEvents
            
            Label5.Caption = "请勿移动协调器!"
            Call Led_On(1, GREEN)
            
            tmrData.Enabled = True: DoEvents      '数据收发
        Else
            Label5.Caption = "请接入协调器!"
            If Check(1) = 1 Then
                Call Led_On(1, RED)
            Else
                Call Led_On(1, BLACK)
            End If
            ShowWindow Me.hWnd, SW_RESTORE
            tmrData.Enabled = False: DoEvents
            'tmrConnect.Enabled = True: DoEvents
        End If
    End Sub这样的可靠性高不高呀?
    我试试看看先……
      

  5.   


    还有,能提示我如何分辨是我的USB设备的接入或者移除动作,还是其它USB(U盘、蓝牙等等)接入或者移除动作吗?
      

  6.   


    以下是我参考的VB打开USB设备的代码,有印象还是你给我的,帮我看看如何分辨是我的USB设备的接入或者移除动作,还是其它USB(U盘、蓝牙等等)接入或者移除动作,好吗?Public Sub ConnectRMC()              '查找及打开设备
        Dim HidGuid As GUID
        Dim DeviceInfoSet As Long
        Dim MemberIndex As Long
        Dim result As Long
        Dim Needed As Long
        Dim DetailData As Long
        Dim PreparsedData As Long
        Dim DetailDataBuffer() As Byte
        Dim DevicePathName As String
        
        Dim LastDevice As Boolean
        Dim MyDeviceDetected As Boolean
        
        LastDevice = False
        MyDeviceDetected = False
        
        result = HidD_GetHidGuid(HidGuid)
        DeviceInfoSet = SetupDiGetClassDevs(HidGuid, 0, 0, (DIGCF_PRESENT Or DIGCF_DEVICEINTERFACE))
        'DataString = GetDataString(DeviceInfoSet, 32)
        
        MemberIndex = 0
        
        For MemberIndex = 0 To 10
            MyDeviceInterfaceData.cbSize = LenB(MyDeviceInterfaceData)
            result = SetupDiEnumDeviceInterfaces(DeviceInfoSet, 0, HidGuid, MemberIndex, MyDeviceInterfaceData)
        
            If result = 0 Then LastDevice = True
        
            If result <> 0 Then
                MyDeviceInfoData.cbSize = Len(MyDeviceInfoData)
                result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, MyDeviceInterfaceData, 0, 0, Needed, 0)
                DetailData = Needed            MyDeviceInterfaceDetailData.cbSize = Len(MyDeviceInterfaceDetailData)
                ReDim DetailDataBuffer(Needed)            Call RtlMoveMemory(DetailDataBuffer(0), MyDeviceInterfaceDetailData, 4)
                
                result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, MyDeviceInterfaceData, VarPtr(DetailDataBuffer(0)), DetailData, Needed, 0)
                
                DevicePathName = CStr(DetailDataBuffer())
                DevicePathName = StrConv(DevicePathName, vbUnicode)
                DevicePathName = Right$(DevicePathName, Len(DevicePathName) - 4)
                
                HidDevice = CreateFile(DevicePathName, GENERIC_READ Or GENERIC_WRITE, (FILE_SHARE_READ Or FILE_SHARE_WRITE), 0, OPEN_EXISTING, 0, 0)  '打开设备DevicePathName 是由 SetupDiGetDeviceInterfaceDetail返回的
                
                If HidDevice <> INVALID_HANDLE_VALUE Then
                    DeviceAttributes.Size = LenB(DeviceAttributes)
                    result = HidD_GetAttributes(HidDevice, DeviceAttributes)    '获取设备VendorID和ProductID
                    result = CloseHandle(HidDevice)
                    If result <> 0 And DeviceAttributes.VendorID = MyVendorID And DeviceAttributes.ProductID = MyProductID And DeviceAttributes.VersionNumber = MyVersionNumber Then
                        HidDevice = CreateFile(DevicePathName, GENERIC_READ Or GENERIC_WRITE, (FILE_SHARE_READ Or FILE_SHARE_WRITE), 0, OPEN_EXISTING, 0, 0)
                        If HidDevice <> INVALID_HANDLE_VALUE Then
                            MyDeviceDetected = True
                            Exit For
                        'Else
                            'MsgBox ("再次打开失败")
                        End If
                    Else
                        'MsgBox ("管理平台与设备无法匹配")
                    End If
                Else
                    'MsgBox ("打开设备失败")
                End If
            End If
        Next MemberIndex
            
        If MyDeviceDetected = True Then
            FindTheHid = True
            'MsgBox ("设备连接正常")
            Exit Sub
        Else
            FindTheHid = False
            'MsgBox ("无法找到设备")
        End If
    End Sub