我知道条形码扫描器就像一个键盘一样。我需要的是具有某种api(.net/c#优选)的扫描仪,我可以插入到我的应用程序中。有没有一个特定的扫描仪硬件供应商 devs已经使用或正在使用,有一个.net API?或者我可以使用任何扫描器并在其周围构建api或使用其中一种开源软件?有没有可以用于集成到我的应用程序的.net api的条形码扫描仪(硬件)?
所以我想做的一件事就是能够将光标放在特定的文本字段上而不需要USB接口扫描仪的数值。
感谢
我知道条形码扫描器就像一个键盘一样。我需要的是具有某种api(.net/c#优选)的扫描仪,我可以插入到我的应用程序中。有没有一个特定的扫描仪硬件供应商 devs已经使用或正在使用,有一个.net API?或者我可以使用任何扫描器并在其周围构建api或使用其中一种开源软件?有没有可以用于集成到我的应用程序的.net api的条形码扫描仪(硬件)?
所以我想做的一件事就是能够将光标放在特定的文本字段上而不需要USB接口扫描仪的数值。
感谢
要留在这就像一个键盘,你也可以尝试扫描,来检测你的整个应用程序内按下所有关键。要在您的应用程序中获得KeyPress
事件,您应将Form.KeyPreview
设置为true
并注册到上述表单的事件。
现在,在发送到当前活动控件之前,您会收到每个密钥,并且您可以使用它,无论您喜欢什么。为防止在完成工作后它将发送到当前的活动控件,请将e.Handled
设置为true
。
但是这种解决方案具有绝对两个缺点:
我已经实现了使用条形码扫描仪类似的系统。我是很确定(不是100%很久以前),文本作为一个大字符串进来,只提出了一个按键事件。因此,您可以做的是将输入字符串与典型的条形码字符串进行匹配,例如KeyPressEvent,如果匹配,则查找该项目。或者甚至只是检查字符串中字符的长度(就好像它的键盘输入一次只能是1个字符一样)。
您是否在基本表单上测试过它?
嗯,这取决于。如果你有一个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();
}
}
感谢Oli,这听起来更像我正在寻找的解决方案。我会认为扫描仪通常需要开发人员构建一个API来处理他们想要扫描仪的行为? – simplyme