Я недавно получил Сканнер штрихкода Metrologic (USB-порт), поскольку все уже знают, что он работает эмулятором клавиатуры из поля.
Как я настраиваю сканер и мое приложение так, чтобы мое приложение могло обработать данные штрихкода непосредственно? Таким образом, я не хочу, чтобы пользователь сфокусировался на "Текстовом поле" и затем обработал данные, когда событие KeyPress стреляет.
Обычно сканеры штрих-кода можно настроить на отправку некоторых символов до и после строки. Так что, если вы добавите, например, «F12» перед строкой штрих-кода, вы можете зафиксировать это и переместить фокус в правое поле.
Узнайте, как это сделать, в руководстве к сканеру штрих-кода.
Я полагаю, что самый простой способ сделать это - перехватить нажатия клавиш на более высоком уровне, например PreviewKeyDown в winforms (или использовать KeyDown
в форме, установите KeyPreview
- true
, и используйте e.SuppressKeyPress
, чтобы остановить спуск клавиши к элементам управления). может быть прямым API для устройства; там может и не быть.
Хотя у вашего штрих-кода есть 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, вам больше не нужен фокус в текстовом поле.
Ищите возврат каретки, чтобы узнать, когда для вашего кода станет доступен полный штрих-код.
Вы можете использовать событие 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;