如何在不让用户先聚焦于文本框的情况下读取条形码?

10

我最近购买了一台Metrologic 条形码扫描仪(USB接口),众所周知它可以直接作为键盘模拟器使用。

那么,我该如何配置扫描仪和我的应用程序,使得我的应用程序可以直接处理条形码数据,而无需用户聚焦在“文本字段”上,并等待呼出 KeyPress 事件后再处理数据?

4个回答

7
通常情况下,可以配置条形码扫描仪在字符串前后发送一些字符。因此,如果您在条形码字符串前添加“F12”等内容,则可以捕获该内容并将焦点移动到正确的字段。
请查阅条形码扫描仪手册以了解如何进行此操作。

4
通常你仍需要一个文本框,这样当扫描失败时用户可以手动输入条形码。这就是为什么我认为这是最佳选择的原因。 - Dean Harding
这就是我们使用支票读卡器的方式;无论它们是键盘楔入式还是 USB,我们都会配置它们发送一个在键盘上不易输入的起始字符序列。当我们通过表单的 KeyDown 方法看到该序列时,我们会吞咽掉那些特殊的按键并将输入焦点移动到所需的编辑框中。效果相当好。 - robsoft

3
虽然您的条形码有USB连接器,但它可以被编程为键盘楔形或RS232。请参见此页面:http://www.instrumentsandequipmentco.com/support/faq-metrologic.htm,其中说到:

问:USB键盘和USB销售点之间有什么区别? 当MX009设置为通信为USB键盘时,扫描的数据将出现在您PC上正在运行的当前应用程序中。该数据输入方式就像按下键盘上的按键一样。当MX009设置为通信为USB销售点设备时,数据会像RS232数据一样传输到USB端口,并且必须将USB端口配置为COM端口。MX009出厂时已经设置为USB键盘或USB销售点。

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

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

查找回车符以了解完整的条形码何时可供您的代码使用。


1
我猜最简单的方法是在更高级别上拦截按键,例如在winforms中的 PreviewKeyDown(或使用表单上的KeyDown,将KeyPreview设置为true,并使用e.SuppressKeyPress阻止键传递到控件)。可能会有直接针对设备的API,也可能没有。

0
您可以使用表单上的OnShortcut事件拦截键盘按键。 检查您在条码扫描仪上配置的前缀,设置为Handled以处理所有按键直到获取到条码扫描仪后缀。 在快捷方式处理程序中构建条形码字符串。
以下代码是我自己使用的内容改编而来,但目前尚未经过测试。
    // 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接