我有一个win表单应用程序,我正在尝试添加条形码扫描。
该窗口具有用户填写的多个文本框。当用户单击一个框并扫描条形码时,它将进入所选的文本框。
即使突出显示不同的文本框,是否可以编写事件以便在扫描时将文本放入特定的文本框中?
如果是这样,我该怎么做呢。 感谢
答案 0 :(得分:3)
有不同类型的条形码扫描仪:键盘楔形和串行扫描仪。
键盘楔将发送'消息',就好像它们是从键盘输入一样。所以通常只有当某种编辑框有焦点时它们才会出现。
要将扫描数据放在没有焦点的文本框中,最好和最安全的方法是在单独的后台线程中捕获消息(这可能适用于KB wedge和串行)。使用KB wedge,您的线程必须检查(前缀)代码以查看它们是否来自条形码扫描器 - 如果没有,则转发到正常的Windows消息处理。
某些条形码扫描仪可能有可用的库。
另一方面,如果应用程序只有一个窗口,并且使用了KB楔形扫描仪,则可以避免单独的线程,并且可以在该窗口内捕获消息,进行分析,如果检测到条形码,数据可以放在右边的文本框中。但在扫描条形码时,我永远不会相信用户会出现在正确的文本框中 - 实际上,该文本框最好是只读的。
但是,通常,当应用程序有多个窗口时,后台线程可能是唯一的选择。一些例子:
用户扫描文档上的条形码(例如发票),并且需要自动打开该文档。该线程可以捕获代码,并打开该文档。
用户扫描EAN代码,并希望查看产品的详细信息。与上述相同。
答案 1 :(得分:0)
这是一些处理扫描事件的示例代码。 scnner必须配置为串行扫描仪,它们通常带有配置扫描仪的条形码。
private SerialPort InitializeScanner()
{
SerialPort port = null;
bool result;
int iPort = 2;
do
{
try
{
result = true;
port = new SerialPort("COM" + iPort, 9600, Parity.None, 8, StopBits.One);
port.Close();
if (!port.IsOpen)
port.Open();
port.DiscardOutBuffer();
port.DiscardInBuffer();
port.DataReceived += OnScan;
}
catch (IOException)
{
iPort++;
result = false;
}
} while (result == false && iPort <= 20);
return port;
}
关于这一行的全部内容:
port.DataReceived += OnScan;
这是OnScan的一个例子。您可以在该函数中设置任何文本框,但请注意您必须使用Invoke来设置GUI组件,串行端口线程与GUI的线程不同。
private void OnScan(object sender, SerialDataReceivedEventArgs args)
{
SerialPort port = sender as SerialPort;
string line = port.ReadExisting();
int idx = line.IndexOf('\r');
if (idx != -1)
{
line = line.Substring(0, idx);
_scanBuffer += line;
Invoke((MethodInvoker)delegate { OnScan(_scanBuffer); });
_scanBuffer = "";
}
else
{
_scanBuffer += line;
}
}