C# 条形码扫描事件捕获文本
我有一个win forms应用程序,我正在尝试添加条形码扫描 该窗口有多个可供用户填写的文本框。当用户单击一个框并扫描条形码时,它会进入所选文本框 即使高亮显示了不同的文本框,也可以在扫描时编写事件将文本放入特定的文本框中吗 如果是这样的话,我该怎么做呢。C# 条形码扫描事件捕获文本,c#,winforms,C#,Winforms,我有一个win forms应用程序,我正在尝试添加条形码扫描 该窗口有多个可供用户填写的文本框。当用户单击一个框并扫描条形码时,它会进入所选文本框 即使高亮显示了不同的文本框,也可以在扫描时编写事件将文本放入特定的文本框中吗 如果是这样的话,我该怎么做呢。 谢谢有不同类型的条形码扫描仪:键盘楔型和串行型 键盘楔将发送“消息”,就好像它们是从键盘输入的一样。因此,通常只有当某种编辑框具有焦点时,它们才会出现 要将扫描的数据无焦点地放在文本框中,最好和最安全的方法是在单独的背景线程中捕获消息(这既适
谢谢有不同类型的条形码扫描仪:键盘楔型和串行型 键盘楔将发送“消息”,就好像它们是从键盘输入的一样。因此,通常只有当某种编辑框具有焦点时,它们才会出现 要将扫描的数据无焦点地放在文本框中,最好和最安全的方法是在单独的背景线程中捕获消息(这既适用于KB wedge,也适用于串行线程)。使用KB wedge,线程必须检查(前缀)代码是否来自条形码扫描仪-如果不是,则转发到正常的windows消息处理 有些条形码扫描器可能有已经为您提供的库 另一方面,如果应用程序只有一个窗口,并且使用KB楔形扫描仪,则可以避免使用单独的线程,并且可以在该窗口内捕获消息并进行分析,如果检测到条形码,则可以将数据放入正确的文本框中。但我永远不会相信用户在扫描条形码时会出现在正确的文本框中——事实上,该文本框最好是只读的 但是,一般来说,当应用程序有多个窗口时,后台线程可能是唯一的选择。一些例子:
- 用户扫描文档(例如发票)上的条形码,该文档需要自动打开。线程可以捕获代码并打开该文档
- 用户扫描EAN代码,并希望查看产品的详细信息。同上
- 以下是一些处理扫描事件的示例代码。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;
}
下面是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;
}
}
由于.NET的Winforms没有任何内置功能来处理条形码扫描,因此可能需要使用用于执行此操作的库来完成此操作。既然你没有告诉我们你用哪个图书馆来做这件事,这里的任何人都不可能回答这个问题。也许你可以创建一个新的库,并将名称/链接发布到你正在使用的库,这样我们就可以看到你在处理什么?你能推荐任何库使用吗?@inkey几乎所有的条形码扫描仪(至少是我使用过的那些)都以所谓的“键盘楔块”模式发送文本。它将所有键发送到突出显示的字段,就像您在键盘上键入它们一样。不,抱歉,原因有二。1.我还没有写任何条形码扫描代码,2。关于堆栈溢出,这里的建议与主题无关。我对此有点生疏,但表单有一个
KeyPreview
属性和一个PreviewKeyDown
事件。我会先用谷歌搜索一下。
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;
}
}