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

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

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

10
задан Rob Kennedy 22 April 2010 в 16:10
поделиться

4 ответа

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

Узнайте, как это сделать, в руководстве к сканеру штрих-кода.

6
ответ дан 4 December 2019 в 01:30
поделиться

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

1
ответ дан 4 December 2019 в 01:30
поделиться

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

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

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

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

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

3
ответ дан 4 December 2019 в 01:30
поделиться

Вы можете использовать событие 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;
0
ответ дан 4 December 2019 в 01:30
поделиться