我怎样才能读取条形码,而不用让用户先把文本对焦呢?

我最近购买了Metrologic条码扫描器(USB端口),因为大家已经知道它可以用作开箱即用的键盘模拟器。

如何configuration扫描仪和我的应用程序,以便我的应用程序可以直接处理条形码数据? 也就是说,我不希望用户关注“文本字段”,然后在触发KeyPress事件时处理数据。

Solutions Collecting From Web of "我怎样才能读取条形码,而不用让用户先把文本对焦呢?"

通常条形码扫描器可以配置为在字符串之前和之后发送一些字符。 因此,如果在条形码字符串之前添加例如“F12”,则可以捕获该对象并将焦点移至右侧字段。

检查条码扫描仪手册如何做到这一点。

虽然您的条形码有一个USB连接器。 它可以编程为键盘楔形或RS232。 见这个页面http://www.instrumentsandequipmentco.com/support/faq-metrologic.htm它说的地方

问:USB键盘和USB销售点之间有什么区别? 当MX009设置为以USB键盘通信时,扫描的数据将显示在当前PC上活动的应用程序中。 数据输入就像按键盘上的按键一样。 当MX009设置为通过USB销售点设备进行通信时,数据将传输到USB端口(如RS232数据),并且USB端口必须像COM端口那样配置。 MX009将出厂设置为USB键盘或USB销售点。

当您的程序接受RS232时,您不再需要在文本字段中对焦。

  1. 将您的条形码重新编程为销售点(RS232)
  2. 重新编程通常发送一个后缀 – 回车/ CR / $ 0D在条形码的末尾。

查找回车,知道何时完整的条形码可用于您的代码。

我猜想最简单的方法是截获更高级别的按键,比如WinForms中的PreviewKeyDown (或者在窗体上使用KeyDown ,将KeyPreview设置为true ,并使用e.SuppressKeyPress来停止按键到控件)。 设备可能有一个直接的API; 有可能没有。

您可以使用窗体上的OnShortcut事件来拦截键盘按下。 检查您在barcodescanner上配置的前缀是否出现,并设置为Handled al按键,直到获得条码扫描器后缀。 在您的快捷方式处理程序内建立条形码字符串

下面的代码是从我自己使用的东西改编而来的,但是没有经过当前的测试。

  // Variables defined on Form object GettingBarcode : boolean; CurrentBarcode : string; TypedInShiftState: integer; // 16=shift, 17=ctrl, 18=alt procedure Form1.FormShortCut(var Msg: TWMKey; var Handled: Boolean); var Character:Char; begin Character:=Chr(MapVirtualKey(Msg.CharCode,MAPVK_VK_TO_CHAR)); if GettingBarcode then begin // Take care of case if (TypedInShiftState<>16) and CharInSet(Character,['A'..'Z']) then Character:=Chr(Ord(Character)+32); TypedInShiftState:=0; // Tab and Enter programmed as suffix on barcode scanner if CharInSet(Character,[#9, #13]) then begin // Do something with your barcode string try HandleBarcode(CurrentBarcode); finally CurrentBarcode:=''; Handled:=true; GettingBarcode:=False; end; end else if CharInSet(Character,[#0..#31]) then begin TypedInShiftState:=Msg.CharCode; Handled:=True; end else begin CurrentBarcode:=CurrentBarcode+Character; Handled:=true; end; end else begin if Character=#0 then begin TypedInShiftState:=Msg.CharCode; end else if (TypedInShiftState=18) and (Character='A') then begin GettingBarcode:=True; CurrentBarcode:=''; Handled:=true; end; end; end;