我最近购买了Metrologic条形码扫描仪(USB端口),因为每个人都已经知道它可以作为开箱即用的键盘模拟器。
如何配置扫描仪和我的应用程序,以便我的应用程序可以直接处理条形码数据?也就是说,我不希望用户专注于“文本字段”,然后在KeyPress事件触发时处理数据。
答案 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时,您不再需要在文本字段中进行聚焦。
查看回车符以了解代码何时可以使用完整的条形码。
答案 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;