二维码扫描仪与C#WPF的集成

二维码扫描仪与C#WPF的集成,c#,wpf,qr-code,barcode-scanner,C#,Wpf,Qr Code,Barcode Scanner,我正在编写一个WPF应用程序(MVVM),它需要使用二维码扫描仪(型号:Symbol DS4308-USB以连接桌面)从二维码图像中读取数据。我在谷歌上搜索了同样的内容,发现我们可以使用文本框读取QR数据,而且它可以工作。但我的应用程序没有文本框来捕获二维码数据,但我需要让扫描仪在扫描完成后提供事件 我试着用记事本,扫描仪在扫描二维码时将扫描的值写入记事本 是否有任何通用的开源库来获取扫描程序事件?我没有专门使用4308,但我在工作中对符号扫描程序进行编程,因此我对它们很熟悉 首先,忘记键盘模式

我正在编写一个WPF应用程序(MVVM),它需要使用二维码扫描仪(型号:Symbol DS4308-USB以连接桌面)从二维码图像中读取数据。我在谷歌上搜索了同样的内容,发现我们可以使用文本框读取QR数据,而且它可以工作。但我的应用程序没有文本框来捕获二维码数据,但我需要让扫描仪在扫描完成后提供事件

我试着用记事本,扫描仪在扫描二维码时将扫描的值写入记事本


是否有任何通用的开源库来获取扫描程序事件?

我没有专门使用4308,但我在工作中对符号扫描程序进行编程,因此我对它们很熟悉

首先,忘记键盘模式。它可以方便地直接扫描到文档等,但听起来你想直接阅读扫描仪。如果是,请转到第6-6节中的条形码并扫描“简单COM端口模拟”。这将导致扫描仪现在显示为串行设备,然后可以使用C#SerialPort类读取:

this.Scanner = new SerialPort(this.SymbolPort);
this.Scanner.BaudRate = 9600;
this.Scanner.DataReceived += Scanner_DataReceived;
this.Scanner.Open();
.
.
.
private void Scanner_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    var len = this.Scanner.BytesToRead;
    var bytes = new byte[len];
    this.Scanner.Read(bytes, 0, len);
    var str = Encoding.ASCII.GetString(bytes);
    // do something with str here
}

如果你想让你的应用程序真正的用户友好,那么你也可以通过设备PID和VID来确定使用哪个COM端口。要获取PID/VID,只需转到设备管理器并检查设备的属性。要查找COM端口,请使用上的代码,尽管这将搜索系统上安装的所有设备,而不管它们是否实际插入,因此您需要对照SerialPort.GetPortNames()进行交叉检查。

我没有专门使用4308,但我在工作时编程了符号扫描仪,因此我对它们很熟悉

首先,忘记键盘模式。它可以方便地直接扫描到文档等,但听起来你想直接阅读扫描仪。如果是,请转到第6-6节中的条形码并扫描“简单COM端口模拟”。这将导致扫描仪现在显示为串行设备,然后可以使用C#SerialPort类读取:

this.Scanner = new SerialPort(this.SymbolPort);
this.Scanner.BaudRate = 9600;
this.Scanner.DataReceived += Scanner_DataReceived;
this.Scanner.Open();
.
.
.
private void Scanner_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    var len = this.Scanner.BytesToRead;
    var bytes = new byte[len];
    this.Scanner.Read(bytes, 0, len);
    var str = Encoding.ASCII.GetString(bytes);
    // do something with str here
}

如果你想让你的应用程序真正的用户友好,那么你也可以通过设备PID和VID来确定使用哪个COM端口。要获取PID/VID,只需转到设备管理器并检查设备的属性。要查找COM端口,请使用上的代码,尽管这将搜索系统上安装的所有设备,而不管它们是否已实际插入,因此您需要对照SerialPort.GetPortNames()对其进行交叉检查。

根据您的描述,连接的扫描器似乎像键盘一样工作。因此,我建议您在UI上收听按键,或使用WindowsSDK(User32 DLL)收听按键事件。这只是一个建议。根据我的经验,所有的扫描仪都像一个键盘。他们将以文本形式输入条形码/二维码,然后按enter键。您不需要文本框来存储该值,因为@LupuSilviu已经建议您可以监听keypresses@p3tch,一些扫描仪可以在托管模式下运行,并且可以通过SDK控制扫描仪的行为。但在这里,他似乎有一个处于非托管模式的扫描仪,这就是为什么使用KeyPress的解决方案应该有效的原因。也许我只是在使用便宜的扫描仪:-)这里@NithyThanks@Lupu Silviu似乎有一个C#NET的扫描仪示例…我已经下载并使用了适合我的扫描仪的SDK,我可以获得OnScanDetected事件…感谢您的宝贵意见。扫描仪从你的描述来看,连接就像一个键盘。因此,我建议您在UI上收听按键,或使用WindowsSDK(User32 DLL)收听按键事件。这只是一个建议。根据我的经验,所有的扫描仪都像一个键盘。他们将以文本形式输入条形码/二维码,然后按enter键。您不需要文本框来存储该值,因为@LupuSilviu已经建议您可以监听keypresses@p3tch,一些扫描仪可以在托管模式下运行,并且可以通过SDK控制扫描仪的行为。但在这里,他似乎有一个处于非托管模式的扫描仪,这就是为什么使用KeyPress的解决方案应该有效的原因。也许我只是在使用便宜的扫描仪:-)这里@NithyThanks@Lupu Silviu似乎有一个C#NET的扫描仪示例…我已经下载并使用了适合我的扫描仪的SDK,我可以获得OnScanDetected事件…感谢您的宝贵评论。我已经发表了扫描器作为串行设备也实现了上述代码,但我在扫描二维码时未触发扫描器\u DataReceived事件。有关我的实现的更多信息,我创建了新的serialport对象(_serialPortScanner=new serialport())和事件_serialPortScanner.DataReceived+=_serialPortScanner\u DataReceived;但扫描二维码时不会触发该事件。您是否尝试过使用其他串行终端应用程序进行测试?Putty是一个很好的工具,它会立即告诉您问题是在于scanner配置还是您的代码。我已经下载了scanner的SDK,并用于获取onscandtected事件。非常感谢@Mark FeldmanI制作了扫描仪,因为串行设备也实现了上述代码,但我不会在扫描二维码时触发扫描仪\u DataReceived事件。有关我的实现的更多信息,我创建了新的serialport对象(_serialPortScanner=new serialport())和事件_serialPortScanner.DataReceived+=_serialPortScanner\u DataReceived;但扫描二维码时不会触发该事件。您是否尝试过使用其他串行终端应用程序进行测试?Putty是一个很好的工具,它会立即告诉您问题是在于scanner配置还是您的代码。我已经下载了scanner的SDK,并用于获取onscandtected事件。非常感谢@Mark Feldman