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口发生的消息?
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口发生的消息?
不需要定时器。直接利用系统的 OnDeviceChange 消息。wParam = DBT_DEVICEREMOVECOMPLETE 就是设备移除。
但是每次我USB设备连接或者移除的时候都获取不了“wParam = DBT_DEVICEREMOVECOMPLETE”,这可如何是好呀?跟我USB设备的驱动有关吗?唉,不知道在哪里修改USB设备驱动与连接或者移除有关的源代码,头大……
哦哦,这个方法好哦,这样就取代了我用定时器去打开句柄了?
'使用定时器的查询来获取是插入,还是拔出。
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这样的可靠性高不高呀?
我试试看看先……
还有,能提示我如何分辨是我的USB设备的接入或者移除动作,还是其它USB(U盘、蓝牙等等)接入或者移除动作吗?
以下是我参考的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