如何在不让用户首先关注文本框的情况下阅读条形码?

时间:2010-04-22 05:47:20

标签: c# java windows delphi barcode

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

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

4 个答案:

答案 0 :(得分:6)

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

检查条形码扫描仪手册如何操作。

答案 1 :(得分:3)

虽然您的条形码有一个USB接口。它可以编程为键盘楔或RS232。 查看此页面http://www.instrumentsandequipmentco.com/support/faq-metrologic.htm 在哪里说

<强> Q值。 USB键盘和USB销售点有什么区别? 当MX009设置为以USB键盘进行通信时,扫描的数据将显示在PC上处于活动状态的当前应用程序中。输入数据就像在键盘上按下键一样。当MX009设置为作为USB销售点设备进行通信时,数据将像RS232数据一样传输到USB端口,并且USB端口必须配置为COM端口。 MX009出厂设置为USB键盘或USB销售点。

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

  1. 将条形码重新编程为销售点(RS232)
  2. 重新编程通常会发送后缀 - 条形码末尾的回车/ CR / $ 0D。
  3. 查看回车符以了解代码何时可以使用完整的条形码。

答案 2 :(得分:1)

我猜想最简单的方法是拦截更高级别的按键,例如winforms中的PreviewKeyDown(或者在表单上使用KeyDown,设置{{1} } KeyPreview,并使用true来停止按键进入控件。 可能是设备的直接API;可能没有。

答案 3 :(得分:0)

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

以下代码改编自我自己使用的内容,但目前尚未经过测试。

    // 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;