0

バーコード スキャナーがキーボードのようなものであり、そのように機能することは理解しています。必要なのは、アプリにプラグインできるある種の API (できれば .net/c#) を持つスキャナーです。開発者が使用した、または現在使用している、.net API を持つ特定のスキャナー ハードウェアベンダーはありますか? または、任意のスキャナーを使用して、その周りに API を構築するか、オープン ソースのいずれかを使用できますか?

したがって、私がやりたいことの 1 つは、特定のテキスト フィールドにカーソルを置かずに USB スキャナから値を取得できるようにすることです。

ありがとう

4

3 に答える 3

4

まあ、それは依存します。USB バーコード スキャナーをお持ちの場合は、キーボードのように機能し、スキャンしたテキストをフォーカスされたコントロールに直接読み取ります。シリアル バーコード スキャナーがある場合はSerialPort、.NET でクラスを使用する必要があります。

テキストボックスなどに入力する前にデータを解析する必要がある場合は、シリアル スキャナーを使用することをお勧めします。

使用するコードサンプルは次のとおりです。

public partial class Form1 : Form
{
     SerialPort _serialPort;

     // delegate is used to write to a UI control from a non-UI thread
     private delegate void SetTextDeleg(string text);

     private void Form1_Load(object sender, EventArgs e)
     {
           // all of the options for a serial device
           // can be sent through the constructor of the SerialPort class
           // PortName = "COM1", Baud Rate = 19200, Parity = None, 
           // Data Bits = 8, Stop Bits = One, Handshake = None
           _serialPort = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);
           _serialPort.Handshake = Handshake.None;
           _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
           _serialPort.ReadTimeout = 500;
           _serialPort.WriteTimeout = 500;
           _serialPort.Open();
     }

     private void btnStart_Click(object sender, EventArgs e)
     {
           // Makes sure serial port is open before trying to write
           try
           {
                if(!_serialPort.IsOpen)
                     _serialPort.Open();

                _serialPort.Write("SI\r\n");
           }
           catch (Exception ex)
           {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
           }
     }

     void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
     {
          Thread.Sleep(500);
          string data = _serialPort.ReadLine();
          this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
     }

     private void si_DataReceived(string data)
     {
           textBox1.Text = data.Trim();
     }
}
于 2010-03-03T11:19:13.143 に答える
1

キーボードのように機能するスキャナーを使用して、アプリケーション全体で押されたすべてのキーを検出することもできます。KeyPressアプリケーション内でイベントを取得するには、フォームの上記のイベントに設定Form.KeyPreviewして登録する必要があります。true

これで、現在のアクティブなコントロールに送信される前にすべてのキーを受信し、好きなようにそれを使用できます。作業が完了した後に現在のアクティブなコントロールに送信されないようにするには、に設定e.Handledtrueます。

しかし、このソリューションには間違いなく2つの欠点があります。

  1. アプリケーションがアクティブウィンドウである場合にのみ機能します。したがって、ユーザーがフォーカスを別のアプリケーションに変更した場合、キーを押すことはできなくなります。
  2. 着信キーがスキャナーから送信されたのか、ユーザーがキーボードのキーを押しただけなのかを判断するのは非常に難しい場合があります。1つの可能性は、着信キーをキャッシュしてそれらの間のデルタ時間を測定することで、人間は通常スキャナーほど速くは入らないようにする可能性があります(1分間に300回以上キーボードを押す秘書でない限り;-) )。
于 2010-03-03T12:04:09.943 に答える
0

バーコードスキャナーを使用して同様のシステムを実装しました。テキストが1つの大きな文字列として入力され、1つのキープレスイベントのみが発生したことは確かです(100%昔のことではありません)。したがって、入力文字列をKeyPressEventなどの典型的なバーコード文字列と照合し、一致する場合はアイテムを検索することができます。または、文字列内の文字の長さを確認するだけでもかまいません (キーボード入力が一度に 1 文字だけであるように)。

基本的なフォームでテストしましたか?

于 2010-03-03T11:17:39.447 に答える