2017-03-10 65 views
2

我正在研究應從USB縮放中獲取數據的Windows窗體應用程序。 USB秤的處理方式與鍵盤相同。如果有人在秤上放東西,秤就開始鍵入重量字符串,就像USB鍵盤一樣。之前,我會讓磅秤通過點擊表單應用程序中的文本框來將重量字符串輸入到文本框中。但現在我需要獲得體重字符串intern,而不讓Scale直接寫入文本框。以便程序可以在背景中處理來自秤的數據。來自不同鍵盤的RawInput C#.Net

所以起初我想我必須爲輸入選擇一個設備。 (類似Com Port XY上的Keyborad)所以我需要創建一個包含所有輸入設備的列表。如何在C#.Net中執行此操作?

我已經嘗試過:

string[] devices = GetRawInputDeviceList; 
textBox1.Text = devices[0]; 
textBox2.Text = devices[1]; 

但是,這是行不通的。 也許有人可以告訴我該怎麼做?或者你們認爲解決我的問題的最佳方法是什麼? 請幫忙!

+0

「但是,這是不工作」 - 注意詳細說說嗎? –

+0

這篇文章有關於這個主題的有趣鏈接:https://www.codeproject.com/Questions/242099/How-I-can-Read-Write-on-USB-port-with-csharp –

+0

當試圖寫入它所說的文本框:「在ScaleCalc75.exe中發生未處理的'System.NullReferenceException'類型的異常」。 –

回答

1

我想告訴你,下面的代碼幫助我解決了我的問題。 您將需要Mike O'Brien的USB HID庫。您可以在VisualStudio中(的NuGet包)下載,也可以在這裏:https://github.com/mikeobrien/HidLibrary

using System; 
using System.Linq; 
using System.Text; 
using HidLibrary; 

namespace HIDProject 
{ 
    class Program 
    { 
     private const int VendorId = 0x0801; 
     private const int ProductId = 0x0002; 

     private static HidDevice _device; 

     static void Main() 
     { 
      _device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault(); 

      if (_device != null) 
      { 
       _device.OpenDevice(); 

       _device.Inserted += DeviceAttachedHandler; 
       _device.Removed += DeviceRemovedHandler; 

       _device.MonitorDeviceEvents = true; 

       _device.ReadReport(OnReport); 

       Console.WriteLine("Reader found, press any key to exit."); 
       Console.ReadKey(); 

       _device.CloseDevice(); 
      } 
      else 
      { 
       Console.WriteLine("Could not find reader."); 
       Console.ReadKey(); 
      } 
     } 

     private static void OnReport(HidReport report) 
     { 
      if (!_device.IsConnected) { return; } 

      var cardData = new Data(report.Data); 

      Console.WriteLine(!cardData.Error ? Encoding.ASCII.GetString(cardData.CardData) : cardData.ErrorMessage); 

      _device.ReadReport(OnReport); 
     } 

     private static void DeviceAttachedHandler() 
     { 
      Console.WriteLine("Device attached."); 
      _device.ReadReport(OnReport); 
     } 

     private static void DeviceRemovedHandler() 
     { 
      Console.WriteLine("Device removed."); 
     } 
    } 
}