📄 devicemanagement.vb
字号:
Option Strict On
Option Explicit On
Imports System.Runtime.InteropServices
''' <summary>
''' Routines for detecting devices and receiving device notifications.
''' </summary>
Friend Class DeviceManagement
''' <summary>
''' Compares two device path names. Used to find out if the device name
''' of a recently attached or removed device matches the name of a
''' device the application is communicating with.
''' </summary>
'''
''' <param name="m"> a WM_DEVICECHANGE message. A call to RegisterDeviceNotification
''' causes WM_DEVICECHANGE messages to be passed to an OnDeviceChange routine.. </param>
''' <param name="mydevicePathName"> a device pathname returned by
''' SetupDiGetDeviceInterfaceDetail in an SP_DEVICE_INTERFACE_DETAIL_DATA structure. </param>
'''
''' <returns>
''' True if the names match, False if not.
''' </returns>
'''
Friend Function DeviceNameMatch _
(ByVal m As Message, _
ByVal mydevicePathName As String) _
As Boolean
Try
Dim DevBroadcastDeviceInterface As New DEV_BROADCAST_DEVICEINTERFACE_1()
Dim DevBroadcastHeader As New DEV_BROADCAST_HDR()
'The LParam parameter of Message is a pointer to a DEV_BROADCAST_HDR structure.
Marshal.PtrToStructure(m.LParam, DevBroadcastHeader)
If (DevBroadcastHeader.dbch_devicetype = DBT_DEVTYP_DEVICEINTERFACE) Then
'The dbch_devicetype parameter indicates that the event applies to a device interface.
'So the structure in LParam is actually a DEV_BROADCAST_INTERFACE structure,
'which begins with a DEV_BROADCAST_HDR.
'Obtain the number of characters in dbch_name by subtracting the 32 bytes
'in the strucutre that are not part of dbch_name and dividing by 2 because there are
'2 bytes per character.
Dim StringSize As Integer = CInt((DevBroadcastHeader.dbch_size - 32) / 2)
'The dbcc_name parameter of DevBroadcastDeviceInterface contains the device name.
'Trim dbcc_name to match the size of the string.
ReDim DevBroadcastDeviceInterface.dbcc_name(StringSize)
'Marshal data from the unmanaged block pointed to by m.LParam
'to the managed object DevBroadcastDeviceInterface.
Marshal.PtrToStructure(m.LParam, DevBroadcastDeviceInterface)
'Store the device name in a String.
Dim DeviceNameString As New String(DevBroadcastDeviceInterface.dbcc_name, 0, StringSize)
'Compare the name of the newly attached device with the name of the device
'the application is accessing (mydevicePathName).
'Set ignorecase True.
If (String.Compare(DeviceNameString, mydevicePathName, True) = 0) Then
Return True
Else
Return False
End If
End If
Catch ex As Exception
Throw
End Try
End Function
''' <summary>
''' Use SetupDi API functions to retrieve the device path name of an
''' attached device that belongs to a device interface class.
''' </summary>
'''
''' <param name="myGuid"> an interface class GUID. </param>
''' <param name="devicePathName"> a pointer to the device path name
''' of an attached device. </param>
'''
''' <returns>
''' True if a device is found, False if not.
''' </returns>
Friend Function FindDeviceFromGuid _
(ByVal myGuid As System.Guid, _
ByRef devicePathName As String) _
As Boolean
Dim BufferSize As Integer
Dim DeviceFound As Boolean
Dim DeviceInfoSet As IntPtr
Dim LastDevice As Boolean
Dim MemberIndex As Integer
Dim MyDeviceInterfaceDetailData As SP_DEVICE_INTERFACE_DETAIL_DATA
Dim MyDeviceInterfaceData As SP_DEVICE_INTERFACE_DATA
Dim Result As Boolean
Dim Success As Boolean
Try
'***
' API function
' summary
' Retrieves a device information set for a specified group of devices.
' SetupDiEnumDeviceInterfaces uses the device information set.
' parameters
' Interface class GUID.
' Null to retrieve information for all device instances.
' Optional handle to a top-level window (unused here).
' Flags to limit the returned information to currently present devices
' and devices that expose interfaces in the class specified by the GUID.
' Returns
' Handle to a device information set for the devices.
'***
DeviceInfoSet = SetupDiGetClassDevs _
(myGuid, _
vbNullString, _
0, _
DIGCF_PRESENT Or DIGCF_DEVICEINTERFACE)
DeviceFound = False
MemberIndex = 0
Do
'Begin with 0 and increment through the device information set until
'no more devices are available.
'The cbSize element of the MyDeviceInterfaceData structure must be set to
'the structure's size in bytes. The size is 28 bytes.
MyDeviceInterfaceData.cbSize = Marshal.SizeOf(MyDeviceInterfaceData)
'***
' API function
' summary
' Retrieves a handle to a SP_DEVICE_INTERFACE_DATA structure for a device.
' On return, MyDeviceInterfaceData contains the handle to a
' SP_DEVICE_INTERFACE_DATA structure for a detected device.
' parameters
' DeviceInfoSet returned by SetupDiGetClassDevs.
' Optional SP_DEVINFO_DATA structure that defines a device instance
' that is a member of a device information set.
' Device interface GUID.
' Index to specify a device in a device information set.
' Pointer to a handle to a SP_DEVICE_INTERFACE_DATA structure for a device.
' Returns
' True on success.
'***
Result = SetupDiEnumDeviceInterfaces _
(DeviceInfoSet, _
0, _
myGuid, _
MemberIndex, _
MyDeviceInterfaceData)
'Find out if a device information set was retrieved.
If (Result = False) Then
LastDevice = True
Else
'A device is present.
'***
' API function:
' summary:
' Retrieves an SP_DEVICE_INTERFACE_DETAIL_DATA structure
' containing information about a device.
' To retrieve the information, call this function twice.
' The first time returns the size of the structure.
' The second time returns a pointer to the data.
' parameters
' DeviceInfoSet returned by SetupDiGetClassDevs
' SP_DEVICE_INTERFACE_DATA structure returned by SetupDiEnumDeviceInterfaces
' A returned pointer to an SP_DEVICE_INTERFACE_DETAIL_DATA
' Structure to receive information about the specified interface.
' The size of the SP_DEVICE_INTERFACE_DETAIL_DATA structure.
' Pointer to a variable that will receive the returned required size of the
' SP_DEVICE_INTERFACE_DETAIL_DATA structure.
' Returned pointer to an SP_DEVINFO_DATA structure to receive information about the device.
' Returns
' True on success.
'***
MyDeviceInterfaceDetailData = Nothing
Success = SetupDiGetDeviceInterfaceDetail _
(DeviceInfoSet, _
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -