Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
CodeDelphiRAD Studio

Learn About A Powerful Native HID USB Windows Library For Delphi Firemonkey By Winsoft

  1. Introduction

The Native HID library for Firemonkey is a library for communicating with Human Interface Devices. It uses Windows HID Api and supports both Windows 32 and Windows 64. A short video describes for to install the library in your Rad Studio.

2. Components in the Demo and what they do

The Demo contains only one Tbutton and TMemo component for the results in Text after onButton click execution. We first call the SetCursor procedure with chHourGlass type of Cursor. It is typically used to inform the user to wait until an application completes its current operation. Then using Enumerate all the device names are stored in a String Dynamic array. In the next short video you can see the Demo in action.

     To show all the available devices a FOR cycle goes through the DeviceNames DynArray and adds the devices line by line. Depending on the Boolean properties different report is shown in the TMemo.

  • FeatureReportSupported;
if FeatureReportSupported then
              for J := 0 to 9 do
              try
                AddLine('Feature report ' + IntToStr(J) + ': ' + ByteArrayToString(GetFeatureReport(J)));
              except
                on E: Exception do
                  AddLine('Feature report ' + IntToStr(J) + ' exception: ' + E.Message);
              end;
  • InputReportSupported;
if InputReportSupported then
              for J := 0 to 9 do
              try
                AddLine('Input report ' + IntToStr(J) + ': ' + ByteArrayToString(GetInputReport(J)));
              except
                on E: Exception do
                  AddLine('Input report ' + IntToStr(J) + ' exception: ' + E.Message);
              end;
  • ReadSupported
if ReadSupported then
            begin
              // reopen device with read access
              Open(DeviceNames[I], True, False);
              for J := 0 to 9 do
              try
                AddLine('Read: ' + ByteArrayToString(Read(300)));
              except
                on E: Exception do
                  AddLine('Read exception: ' + E.Message);
              end;
            end;

Every device in the Dynamic array is listed with Product Id, Vendor Id, version number, serial number, etc which is in other words the main info of the certain device. All this information is executed in the ShowDeviceInfo procedure.

with Device do
  try
    AddLine('Vendor ID: ' + IntToHex(VendorID, 4));
    AddLine('Product ID: ' + IntToHex(ProductID, 4));
    AddLine('Version number: ' + IntToHex(VersionNumber, 4));
    AddLine('Serial number: ' + SerialNumber);
    AddLine('Manufacturer: ' + Manufacturer);
    AddLine('Product: ' + Product);
    AddLine('Usage page: ' + IntToStr(UsagePage));
    AddLine('Usage: ' + IntToStr(Usage));
    AddLine('Input report length: ' + IntToStr(InputReportLength));
    AddLine('Output report length: ' + IntToStr(OutputReportLength));
    AddLine('Feature report length: ' + IntToStr(FeatureReportLength));
    AddLine('Input buffer count: ' + IntToStr(InputBufferCount));
    for I := 1 to 255 do
      if HasString[I] then
        AddLine('String ' + IntToStr(I) + ': ' + Strings[I])
      else
        Break;
  except
    on E: Exception do
      AddLine('Exception: ' + E.Message);
  end;

There is also some code, executed on the FormShow event of the form.  When OnDeviceArrival event of the device is called, it executes the code bellow:

AddLine;
  AddLine('Device arrival: ' + DeviceName);
  try
    Device.Open(DeviceName, False, False);
    try
      ShowDeviceInfo;
    finally
      Device.Close
    end;
  except
    on E: Exception do
      AddLine('Exception: ' + E.Message);
  end;

When OnDeviceRemoved event of the device is called, it executes the code bellow:

AddLine;
  AddLine('Device removed: ' + DeviceName);

The ‘AddLine’ procedure itself checks if there is no text and lines in the TMemo. If both are true, the first line is skipped.

if (Text = '') and (Memo.Lines.Count = 0) then
    Exit; // skip first empty lines
  Memo.Lines.Add(Text);

You can download the Demo from the link below:

https://winsoft.sk/fnathid.htm

RAD Studio 13.1 Florence Now Available See What's New in RAD Studio 13.1 Delphi is 31 - Webinar Replay

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.

Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

IN THE ARTICLES