0

私はこれをデルファイで行っていました。つまり、オブジェクトとアイテムを同時にリストボックスに追加していました。

function TMainForm.JvHidDeviceController1Enumerate(HidDev: TJvHidDevice;
  const Idx: Integer): Boolean;
var
  N: Integer;
  Dev: TJvHidDevice;
begin
  VID := JvValidateEdit1.Value;
  PID := JvValidateEdit2.Value;
  // MessageDlg(IntToStr(DeviceRadioGroup.ItemIndex), mtInformation, mbOKCancel, 0);
  If (HidDev.Attributes.VendorID = VID) And
    (HidDev.Attributes.ProductID = PID) Then
  begin
    N := ListBox1.Items.Add('dsn: ' + HidDev.SerialNumber);
    JvHidDeviceController1.CheckOutByIndex(Dev, Idx);
    ListBox1.Items.Objects[N] := Dev;
    DeviceMemo.Lines.Append(HidDev.SerialNumber +
      ' : connected(enumerated)   - ' + (TimeToStr(Now)));
    InfoBtn.Enabled := true;
    WriteBtn.Enabled := true;
  end;
  Result := true;
end;

私は Mike から HIDLibrary を訴えています。複数のデバイスがあり、それぞれに異なるシリアル番号があり、リストボックスに追加する必要があります。問題は、オブジェクトをリストボックスに追加できるかどうかわからないことです。デルファイで行っていたように、C# で別のテキストで表示します。デフォルトのテキストは、HidDevice オブジェクトをリストボックスに追加するとデバイスのパスを示しますが、serialNo のみを表示したいのです。シリアルNoを抽出します。各有効な HID デバイスの 1 行で、その serialNo を追加した結果のインデックスを使用して、AllValidHIDDevices に挿入します。リストボックスに追加して、各 HID デバイスがそのシリアル番号にバインドされるようにします。シリアル番号をクリックすると、実際にはそのシリアル番号のソフトウェア スナップショットを使用して HID デバイスを取得しています。

HidDevice CurrentHIDDevice;
List<HidDevice> AllValidHIDDevices = new List<HidDevice>();
IEnumerable<HidDevice> USBDevices;

private void timer1_Tick(object sender, EventArgs e)
{

    AllValidHIDDevices.Clear();
    listBox1.Items.Clear();

    USBDevices = HidDevices.Enumerate(0x0483);

    foreach (HidDevice validHIDDevice in USBDevices.Where(x => x.Attributes.ProductHexId == "0xAB12"))
    {
        byte[] serialNo;

        validHIDDevice.Inserted += deviceInserted;
        validHIDDevice.Removed += deviceRemoved;
        validHIDDevice.MonitorDeviceEvents = true;
        if (validHIDDevice.IsConnected)
        {
            timer1.Stop();
            button1.Enabled = true;
            validHIDDevice.ReadSerialNumber(out serialNo);
            AllValidHIDDevices.Insert(listBox1.Items.Add("Serial Number: " + Encoding.Unicode.GetString(serialNo)), validHIDDevice);
        }
    }
    if (listBox1.Items.Count > 0)
    {
        listBox1.SelectedIndex = 0;
        CurrentHIDDevice = AllValidHIDDevices[listBox1.SelectedIndex];  
    }
}

private void deviceInserted()
{
    this.InvokeEx(x => x.toolStripStatusLabel1.Text = listBox1.Items.Count.ToString() + " device(s) attached");
}

private void deviceRemoved()
{
    foreach (HidDevice validHIDDevice in AllValidHIDDevices)
    {
        if (validHIDDevice.IsOpen)
            validHIDDevice.CloseDevice();
        validHIDDevice.Dispose();
    }
    this.InvokeEx(x => x.toolStripStatusLabel1.Text = "No device(s) attached");
    this.InvokeEx(x => x.listBox1.Items.Clear());
    this.InvokeEx(x => x.button1.Enabled = false);
    this.InvokeEx(x => x.timer1.Start());
}

アイテムが追加されたら、それをクリックして選択し、操作します。

    private void listBox1_Click(object sender, EventArgs e)
    {
        try
        {
            if (listBox1.Items.Count > 0 && listBox1.SelectedIndex >= 0)
                CurrentHIDDevice = AllValidHIDDevices[listBox1.SelectedIndex];
        }
        catch
        {
            MessageBox.Show("Selected item is not a USB device!");
        }
    }
4

1 に答える 1

0

わかりました、私は今これに答えます。

dll は NuGet でダウンロードしたので使っていたのですが、HidDevice クラスに関する変更ができなかった理由がわかり、NuGet がこのライブラリのソース コードもダウンロードして使用していると思っていたのですが、package フォルダに、 dllしかありません。それから私はそれを削除し、ライブラリ自体のソースを GitHub からダウンロードし、それを追加して使用する方法を学びました。HidDevice クラスの ToString 関数を次のように変更しました。

    public override string ToString()
    {
        byte[] SerialNumber;
        ReadSerialNumber(out SerialNumber);
        string SerialNumberString = "Serial Number = " + Encoding.Unicode.GetString(SerialNumber);

        if (SerialNumberString[0] == '\0')
        {
            return string.Format("VendorID={0}, ProductID={1}, Version={2}, DevicePath={3}",
                                _deviceAttributes.VendorHexId,
                                _deviceAttributes.ProductHexId,
                                _deviceAttributes.Version,
                                _devicePath);
        }
        else
        {
            return SerialNumberString;
        }
    }

解決策ははるかに簡単になりました..最初に指摘してくれた@TaWに感謝します。

于 2014-11-30T16:50:12.850 に答える