我知道条形码扫描仪就像一个键盘,就像这样。我需要的是一个扫描仪,它有某种api(.net / c#最好),我可以插入我的应用程序。是否有特定的扫描仪硬件供应商开发人员已经使用或正在使用,具有.net api?或者我可以使用任意扫描仪并在其周围构建api或使用其中一个开源扫描程序?
我想做的一件事就是能够在没有将光标放在特定文本字段上的情况下从usb扫描仪中获取值。
由于
答案 0 :(得分:4)
嗯,这取决于。如果您有一个USB条形码扫描仪,它的作用就像一个键盘,将扫描的文本直接读入聚焦控制。如果您有串行条形码扫描器,则需要使用.NET中的SerialPort
类。
如果您在填写文本框之前需要解析数据等,那么最好的办法就是使用串行扫描仪。
以下是code sample的使用方法:
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();
}
}
答案 1 :(得分:1)
要使用类似键盘的扫描仪,您也可以尝试检测整个应用程序中按下的所有按键。要在您的应用程序中获得KeyPress
个事件,您应该将Form.KeyPreview
设置为true
并注册上述的表单事件。
现在,在发送到当前活动控件之前,您将收到所有密钥,无论您喜欢什么,都可以使用它。要防止它在您完成工作后发送到当前活动控件,请将e.Handled
设置为true
。
但是这个解决方案肯定有两个缺点:
答案 2 :(得分:0)
我使用条形码扫描仪实现了类似的系统。我非常确定(不是很久以前的100%)文本作为一个大字符串进入并且只引发了一个按键事件。所以你可以做的是将输入字符串与典型的条形码字符串匹配,例如KeyPressEvent,如果匹配,则查找该项目。或者甚至只检查字符串中字符的长度(就像它的键盘输入一样,它一次只能是1个字符)。
您是否已在基本表格上进行过测试?