reading from a USB keyboard (HID)

  • Thread starter Thread starter rs
  • Start date Start date
R

rs

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.
 
Back
Top