I recently acquired a Metrologic Barcode scanner (USB port), as everyone already knows it works as a keyboard emulator out of the box.
How do I configure the scanner and
Usually barcode scanners can be configured to send some characters before and after the string. So if you append eg "F12" before the barcode string, you can capture that and move the focus to the right field.
Check the barcode scanner manual how to do that.
I would guess the easiest way to do this would be to intercept key-presses at a higher level, such as PreviewKeyDown in winforms (or use KeyDown
on the form, set KeyPreview
to true
, and use e.SuppressKeyPress
to stop the key going down to the controls). There might be a direct API to the device; there might not.
You can use the OnShortcut event on a form to intercept keyboard presses. Check if the prefix you configured on the barcodescanner appears, and set as Handled al keypresses until you get the barcode scanner suffix. Within your Shortcut handler build up the barcode string
The following code is adapted from something I use myself, but is untested in its current form.
// 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;
Although your barcode has a USB connector. It can be programmed as a Keyboard wedge or RS232. See this page http://www.instrumentsandequipmentco.com/support/faq-metrologic.htm Where it says
Q. What is the difference between USB Keyboard and USB Point-of-Sale? When the MX009 is set-up to communicate as a USB Keyboard, the scanned data will appear in the current application that is active on your PC. The data is entered just as if the keys were pressed on the keyboard. When the MX009 is set-up to communicate as a USB Point-of-Sale device, the data is transmitted to the USB port like RS232 data and the USB port must be configured like a COM port. The MX009 leaves the factory set for either USB Keyboard or USB Point-of-Sale.
When your program accepts RS232 you no longer need focus in a text field.
Look for the Carriage return to know when the complete barcode is available to your code.