Hi guys,
I am trying to read from a USB keyboard using vb.net and HID classes. the
USB keyboard is not my primary keyboard. I have a ps2 keyboard connected and
is detected in device manager as my keyboard. the USB keyboard is detected
as HID keyboard device. the program finds the keyboard if it is attached.
and I am getting valid handles. however, everytime I use the readfile
function I am getting "object reference not set to an instant of an object"
exception. if i use any other function it fails and I am getting -1 in the
"success" parameter. I am including my code:
HidD_GetHidGuid(HidGuid)
'Friend Function FindDeviceFromGuid _
'(ByVal myGuid As System.Guid, _
'ByRef devicePathName() As String) _
'As Boolean
'Purpose : Uses SetupDi API functions to retrieve the device path name of an
' : attached device that belongs to an interface class.
'Accepts : myGuid - an interface class GUID.
' : devicePathName - a pointer to an array of strings that will contain
' : the device path names of attached devices.
'Returns : True if at least one device is found, False if not.
'Fill an array with the device path names of all attached HIDs.
DeviceFound = MyDeviceManagement.FindDeviceFromGuid _
(HidGuid, _
DevicePathName)
'If there is at least one HID, attempt to read the Vendor ID and Product ID
'of each device until there is a match or all devices have been examined.
If DeviceFound = True Then
MemberIndex = 0
Do
HIDHandle = CreateFile _
(DevicePathName(MemberIndex), _
0, _
FILE_SHARE_READ, _
Security, _
OPEN_EXISTING, _
0, _
0)
If (HIDHandle <> INVALID_HANDLE_VALUE) Then
MyHID.DeviceAttributes.Size = Marshal.SizeOf(MyHID.DeviceAttributes)
Result = HidD_GetAttributes(HIDHandle, MyHID.DeviceAttributes)
If (Result <> 0) Then
'Find out if the device matches the one we're looking for.
If (MyHID.DeviceAttributes.VendorID = MyVendorID) And _
(MyHID.DeviceAttributes.ProductID = MyProductID) Then
MyDeviceDetected = True
'Save the DevicePathName so OnDeviceChange() knows which name is my device.
MyDevicePathName = DevicePathName(MemberIndex)
Else
'It's not a match, so close the handle.
MyDeviceDetected = False
Result = CloseHandle(HIDHandle)
End If
Else
'There was a problem in retrieving the information.
MyDeviceDetected = False
Result = CloseHandle(HIDHandle)
End If
End If
'Keep looking until we find the device or there are no more left to examine.
MemberIndex = MemberIndex + 1
Loop Until ((MyDeviceDetected = True) Or _
(MemberIndex = UBound(DevicePathName) + 1))
If MyDeviceDetected Then
rtbstatus.Text = rtbstatus.Text + vbCrLf + "keyboard found"
'The device was detected.
'Register to receive notifications if the device is removed or attached.
Success = MyDeviceManagement.RegisterForDeviceNotifications _
(MyDevicePathName, _
Me.Handle, _
HidGuid, _
DeviceNotificationHandle)
'Debug.WriteLine("RegisterForDeviceNotifications = " & Success)
'Learn the capabilities of the device.
MyHID.Capabilities = MyHID.GetDeviceCapabilities _
(HIDHandle)
If Success Then
'Get and display the Input report buffer size.
'GetInputReportBufferSize()
rtbstatus.Text = rtbstatus.Text + vbCrLf + "register notification is set"
'*******************************
ReadHandle = CreateFile _
(MyDevicePathName, _
GENERIC_READ, _
0, _
Security, _
OPEN_EXISTING, _
0, _
0) I also tried it with overlaping. nogo
rtbstatus.Text = rtbstatus.Text + vbCrLf + "handle created"
'(optional)
'Flush any waiting reports in the input buffer.
MyHID.FlushQueue(ReadHandle)
MyHID.FlushQueue(HIDHandle)
'*****************************************
'start reading
Dim InputReportBuffer() As Byte
Dim NumberOfBytesRead As Long
ReDim InputReportBuffer(32)
success = HidD_GetFeature _
(hidHandle, _
InputReportBuffer(0), _
CInt(UBound(inFeatureReportBuffer) + 1))
'sucess always = false and input report buffer = 0s. I also tried
HidD_GetInputReport and read file functions. nogo.
any idea what i am doing wrong? any input is appreciated.