Re: reading from secondary USB keyboard
From: Marc Reinig (Marco_at_newsgroups.nospam)
Date: 11/13/04
- Next message: Marc Reinig: "Re: How do you read data from a USB port?"
- Previous message: Dennis: "Label in Panl Derived Class"
- In reply to: rs: "reading from secondary USB keyboard"
- Messages sorted by: [ date ] [ thread ]
Date: Sat, 13 Nov 2004 11:22:58 -0800
All keyboards under Windows are aggregated together as a single global
keyboard. You cannot deal with them separately without a filter driver.
You might see what you can do with DirectX.
Marc Reinig
System Solutions
"rs" <aa@d.com> wrote in message news:u_qdnSJBD7tU0AncRVn-pQ@rogers.com...
> 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.
>
>
>
>
>
- Next message: Marc Reinig: "Re: How do you read data from a USB port?"
- Previous message: Dennis: "Label in Panl Derived Class"
- In reply to: rs: "reading from secondary USB keyboard"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|