1

我正在尝试一个简单的 Windows 窗体应用程序,其中用户扫描条形码,然后应用程序解码条形码,然后将一行插入数据库。一个基本的轨道应用程序。我拿起了一个摩托罗拉扫描仪并下载了用于 Windows 开发的 SDK。我读到“附录 A 使用扫描仪 SDK API 编写简单的应用程序”似乎是从开发人员指南开始的好地方(http://support.symbol.com/support/search.do?cmd=displayKC&docType=kc&externalId=14978402apdf&sliceId =&dialogID=311240750&stateId=1%200%20311224446)。我让 5 个控制台示例工作正常,但我无法让 Windows 窗体应用程序工作,永远不会触发 OnBarcode 事件。我跟着这个视频(http://www.youtube.com/watch?v=GfIWWUw4YSc&t=15m47s)由摩托罗拉一步一步。

我似乎遇到了与此类似的问题:摩托罗拉条形码扫描仪 SDK 事件 C#,但我使用的是 USB 连接。

我意识到示例代码最初是用 .net 2.0 编写的,所以我尝试重新编译该项目,但它仍然没有工作。然后我尝试将 CCoreScannerClass 更改为 CCoreScanner 以便嵌入互操作类型可以工作,但这也无济于事。这是示例代码:

using CoreScanner;

namespace Scanner_WindowsFormsApplication
{
public partial class Form1 : Form
{
    CCoreScanner cCoreScanner;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }
    void OnBarcodeEvent(short eventType, ref string pscanData)
    {
        string barcode = pscanData;
        this.Invoke((MethodInvoker)delegate { textBox1.Text = barcode; });


    }
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            //Instantiate CoreScanner Class
            cCoreScanner = new CCoreScanner();
            //Call Open API
            short[] scannerTypes = new short[1];//Scanner Types you are interested in
            scannerTypes[0] = 1; // 1 for all scanner types
            short numberOfScannerTypes = 1; // Size of the scannerTypes array
            int status; // Extended API return code
            cCoreScanner.Open(0, scannerTypes, numberOfScannerTypes, out status);
            // Subscribe for barcode events in cCoreScannerClass
            cCoreScanner.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
            // Let's subscribe for events
            int opcode = 1001; // Method for Subscribe events
            string outXML; // XML Output
            string inXML = "<inArgs>" +
            "<cmdArgs>" +
            "<arg-int>1</arg-int>" + // Number of events you want to subscribe
            "<arg-int>1</arg-int>" + // Comma separated event IDs
            "</cmdArgs>" +
            "</inArgs>";
            cCoreScanner.ExecCommand(opcode, ref inXML, out outXML, out status);
            Console.WriteLine(outXML);
        }
        catch (Exception exp)
        {
            Console.WriteLine("Something wrong please check... " + exp.Message);
        }
    }
}

}

我通读了开发人员指南并发现:“当扫描仪捕获条形码时触发 BarcodeEvent。要接收 BarcodeEvents,应用程序需要使用 SUBSCRIBE_BARCODE 事件类型执行 REGISTER_FOR_EVENTS 方法。” 我是 c# 的新手,所以我真的不知道这意味着什么以及它如何应用于示例。

如果https://stackoverflow.com/users/68043/scott读到这个线程,我很想知道你是如何让 onBarcodeEvent 在你的线程中运行的:从事件调用时对话框挂起

4

4 回答 4

8

要从 Motorola Scanner SDK 获取条码事件,您的扫描仪应该使用 IBM 手持 USB 或 SNAPI。如果它连接到串行端口,它应该处于 NIXDORF 模式 B。如果您的扫描仪以 HIDKB 模式连接,则您不能通过 SDK 获得条形码事件,因为扫描仪作为键盘工作。我的建议是首先尝试 SDK 附带的示例应用程序的可执行文件,并检查您是否可以从提供的应用程序中看到事件。

要将扫描仪配置为正确模式,请参阅文档- 第 5 页和第 6 页

于 2012-05-10T03:24:42.650 回答
2

每次使用条码扫描器时,我发现将条码扫描器简单地用作键盘要容易得多;即,将您的WinForms应用程序中的焦点放在文本框以等待条形码扫描,然后处理TextBox的text_changed事件

于 2012-05-09T17:04:11.880 回答
0

我刚刚遇到了同样的问题。在仔细查看摩托罗拉文档后,我发现以下两行仅告诉扫描仪您想要获取事件。(开启事件)

int upcode = 1001
cCoreScanner.ExecCommand(opcode, ref inXML, out outXML, out status);

现在为了进行条形码扫描,您需要发送操作码 2011。所以代码看起来像这样:

int upcode = 1001
cCoreScanner.ExecCommand(opcode, ref inXML, out outXML, out status);
int upcode = 2011
cCoreScanner.ExecCommand(opcode, ref inXML, out outXML, out status);

这样做时,我确实得到了 BarcodeEvent

于 2013-05-08T10:57:46.213 回答
-1

使用操作码 2011 您设法触发 USB HIDKB 扫描仪的回码事件?

您是否还添加了以下代码:

"<inArgs><scannerID>1</scannerID></inArgs>"

执行 2011 命令时?

于 2014-12-04T07:10:29.590 回答