私は最近、Metrologicバーコードスキャナー(USBポート)を購入しました。これは、箱から出してすぐにキーボードエミュレーターとして機能することを誰もがすでに知っているからです。
アプリがバーコードデータを直接処理できるように、スキャナーとアプリケーションを構成するにはどうすればよいですか?つまり、ユーザーが「テキストフィールド」に焦点を合わせて、KeyPressイベントが発生したときにデータを処理することを望まないのです。
通常、バーコードスキャナーは、文字列の前後にいくつかの文字を送信するように構成できます。したがって、バーコード文字列の前に「F12」などを追加すると、それをキャプチャして、フォーカスを右のフィールドに移動できます。
その方法については、バーコードスキャナーのマニュアルを確認してください。
バーコードにはUSBコネクタが付いていますが。キーボードウェッジまたはRS232としてプログラムできます。このページを参照して くださいhttp://www.instrumentsandequipmentco.com/support/faq-metrologic.htm
Q. USBキーボードとUSBPOSの違いは何ですか? MX009がUSBキーボードとして通信するように設定されている場合、スキャンされたデータは、PCでアクティブになっている現在のアプリケーションに表示されます。キーボードのキーを押したときと同じようにデータが入力されます。MX009がUSBPOSデバイスとして通信するように設定されている場合、データはRS232データのようにUSBポートに送信され、USBポートはCOMポートのように構成する必要があります。MX009は、USBキーボードまたはUSBPOS用に工場出荷時に設定されています。
プログラムがRS232を受け入れると、テキストフィールドにフォーカスする必要がなくなります。
コードで完全なバーコードが利用可能になる時期を知るには、キャリッジリターンを探します。
これを行う最も簡単な方法は、winformsのPreviewKeyDownなどのより高いレベルでのキー押下をインターセプトすることだと思います(またはKeyDown
フォームで使用し、に設定KeyPreview
し、キーがコントロールに下がるのを停止するためにtrue
使用します)。デバイスへの直接APIがある可能性e.SuppressKeyPress
があります。ないかもしれません。
フォームでOnShortcutイベントを使用して、キーボードの押下をインターセプトできます。バーコードスキャナーで設定したプレフィックスが表示されるかどうかを確認し、バーコードスキャナーのサフィックスが表示されるまでHandledalkeypressesとして設定します。ショートカットハンドラー内でバーコード文字列を作成します
次のコードは、私が自分で使用しているものを基にしていますが、現在の形式ではテストされていません。
// 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;