なべひろBlog

プログラミングをメインに仕事に関するアレコレを発信しています。

MVVMなWPFアプリケーションでバーコードリーダーの情報をキャッチする

私が所属している会社は機械要素部品を製造しています。

製品の情報をバーコードから参照してゴニョゴニョしますので、バーコードリーダーを使います。

バーコードリーダーは特殊な物ではなく殆どがキーボードと同じ振る舞いをします。

なのでPreviewKeyDownイベントをキャッチして改行コードを判断できればバーコードから読み取った情報が取得できます。

PreviewKeyDownイベントをキャッチするのはWindowsですTextBoxなどではありません。

絶対にTextBoxにフォーカスがある保証はありません。

作業者に「TextBoxを選択した状態にして!」なんてプログラム制作者のエゴでしかありませんし、現場のオバお姉さん方々はどのコントロールにフォーカスがあるなんて関係ない話です。

アプリケーションはWPFでPrismとReactivePropertyを使い最低限度の記述だけを掲載します。

<Window...>の中に下記2行を追加

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:ri="clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.NET46"
<Window...>の次に
<i:Interaction.Triggers>
<i:EventTrigger EventName="PreviewKeyDown">
<ri:EventToReactiveCommand Command="{Binding BarcodeEvent}"/>
</i:EventTrigger>
</i:Interaction.Triggers>

【ViewModel】

変数宣言

public ReactiveCommand<KeyEventArgs> BarcodeEvent { get; } = new ReactiveCommand<KeyEventArgs>();

コンストラクタで

BarcodeEvent.Subscribe(BarcodeInput).AddTo(Disposable);

イベントが発生した時に実行されるメソッド

private void BarcodeInput(KeyEventArgs e)
{
    if (e.Key != Key.LeftShift && e.Key != Key.Enter)
    {
    }
}

メソッドの中で何をするかは自由ですが、数字はD1やNumPad1といった文字列で取得されるので最後の1文字だけを抽出する必用があります。

2019/11/06 追記

私はてっきりWinFormsと同じようにCRやLFが返ってくるかと思ったら全然違いました。

CRは「LeftCtrl」と「M」、LFは「LeftCtrl」と「J」、CRLFはこのセット、アルファベットの大文字だと「LeftShift」と英文字が取得できます。

実際に使用する時はどんな文字列を返すのか確認した方がよさそうです。

Prism関連記事

PrismのIDialogServiceを試してみる

MVVMなWPFアプリケーションでドラッグ&ドロップをしてみる

Prismを使ったWPFアプリケーションで多重起動を抑制する

Prism使ったWPFでLivetCask.Messagingを使ってみる

Prismで複数のページを持ったアプリを作ってみる

PrismのUserControlを動的に配置する