Как я могу читать штрих-коды, не заставляя пользователя сначала фокусировать текстовое поле?

Недавно я приобрел сканер штрих-кодов Metrologic (USB-порт), как все уже знают, он из коробки работает как эмулятор клавиатуры.

Как мне настроить сканер и мое приложение, чтобы мое приложение могло напрямую обрабатывать данные штрих-кода? То есть я не хочу, чтобы пользователь фокусировался на «текстовом поле», а затем обрабатывал данные при срабатывании события KeyPress.


person Atlas    schedule 22.04.2010    source источник


Ответы (4)


Обычно сканеры штрих-кода можно настроить на отправку некоторых символов до и после строки. Поэтому, если вы добавите, например, «F12» перед строкой штрих-кода, вы можете захватить это и переместить фокус в нужное поле.

Прочтите руководство по сканеру штрих-кода, как это сделать.

person Harriv    schedule 22.04.2010
comment
Обычно вы все равно хотите иметь текстовое поле, чтобы пользователи могли вручную ввести штрих-код в случае сбоя сканирования. Вот почему я думаю, что это лучший выбор. - person Dean Harding; 22.04.2010
comment
Вот как мы это делаем со считывателями чеков; независимо от того, являются ли они клавиатурой или USB, мы настраиваем их для отправки последовательности начальных символов, которую нелегко набрать на клавиатуре. Когда мы видим эту последовательность с помощью метода keydown формы, мы проглатываем эти специальные нажатия клавиш и перемещаем фокус ввода в нужное поле редактирования. Работает довольно хорошо. - person robsoft; 22.04.2010

Хотя ваш штрих-код имеет USB-разъем. Его можно запрограммировать как клавиатуру или RS232. См. эту страницу http://www.instrumentsandequipmentco.com/support/faq-metrologic.htm Где написано

В. В чем разница между USB-клавиатурой и USB-точкой продажи? Если MX009 настроен для обмена данными в качестве USB-клавиатуры, отсканированные данные появятся в текущем приложении, активном на вашем ПК. Данные вводятся так же, как если бы были нажаты клавиши на клавиатуре. Когда MX009 настроен для связи в качестве USB-устройства для точек продаж, данные передаются на USB-порт, как данные RS232, и USB-порт должен быть настроен как COM-порт. MX009 оставляет заводскую настройку либо для USB-клавиатуры, либо для USB-терминала.

Когда ваша программа принимает RS232, вам больше не нужен фокус в текстовом поле.

  1. Перепрограммируйте свой штрих-код как POS-терминал (RS232)
  2. Перепрограммируйте для отправки суффикса обычно - возврат каретки/CR/$0D в конце штрих-кода.

Ищите возврат каретки, чтобы узнать, когда полный штрих-код будет доступен для вашего кода.

person ibandyop    schedule 23.04.2010

Я предполагаю, что самый простой способ сделать это — перехватывать нажатия клавиш на более высоком уровне, например PreviewKeyDown в winforms (или используйте KeyDown в форме, установите KeyPreview на true и используйте e.SuppressKeyPress, чтобы остановить переход ключа к элементам управления). У устройства может быть прямой API; может и нет.

person Marc Gravell    schedule 22.04.2010

Вы можете использовать событие OnShortcut в форме для перехвата нажатий клавиатуры. Проверьте, отображается ли префикс, который вы настроили для сканера штрих-кодов, и установите значение Обработано для всех нажатий клавиш, пока не получите суффикс сканера штрих-кода. В обработчике ярлыков создайте строку штрих-кода.

Следующий код адаптирован из того, что я использую сам, но не тестировался в его текущей форме.

    // 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;
person Jan Oosting    schedule 22.04.2010