バーコードスキャナー用のデバイスに依存しないライブラリを開発しようとしています。Windows環境で動作する必要があります。
私はこの分野でいくつかの調査を行いましたが、この問題の解決策のほとんどは特定のデバイスに依存していますVID&PID(RawInput @ filter by vid&pid string)、私の状況では、デバイスに依存しないデバイスを開発しようとしているため、これは受け入れられませんソリューション。USBバーコードスキャナーで動作します。
実際、これは非常に難しいことです。少なくとも私にとっては、正確な要件があります。また、ユーザーにデバイスをホットプラグするように依頼することはできません(その場合、プラグされたデバイスを検出してvid / pidで抽出することができます)。また、デバイスのVID&PIDデータベースを使用できません。一般的に、私は実際にはvid&pidをまったく使用できません。
また、プログラムから実行しない限り、バーコードスキャナーを再プログラムすることはできません(おそらく、バーコードスキャナー固有のIOCTLを送信して、応答することができますか?)。
現在、この質問で提案されているソリューションを使用し ます。スキャナーの製品IDとベンダーIDが不明な場合に、キーボードデータ入力を無視してUSBバーコードスキャナーを使用してバーコードを読み取る
また、商用ライブラリ(ソースや実装方法に関する情報がないオフコースですが、変更ログに「パフォーマンスカウンター」という単語が含まれていることを考えると、上記のリンクのソリューションを使用したと思います)を見たことがあります。この機能を実装していますが、x64システムでは機能しません。おそらく、コードが乱雑であるか、何らかのフィルター(ミニ)ドライバーを使用しているためです。暗号化されており、再配布できません。
私の正確な質問は 、このHIDキーボードが実際にはキーボードではなく、バーコードスキャナーであると判断する方法はありますか?Win 7 x64で、キーボードではなくバーコードスキャナーとして接続することを確認しました(これはシステムのバグ、または一種でした)。
まさに私が今していること:
- RID_INPUTSINKによる入力の読み取り。
- デバイスのvid&pidによってすべての入力を区別する
- VK_ENTERがバッファに表示されたときに、すべての入力を個別のバッファに入れ、バッファからバーコードを収集します。
私が現在やろうとしていること:
- RID_INPUTSINKによる入力の読み取り
- 特定のデバイスのタイマーを開始し、次のシンボルがVK_ENTERの場合-タイマーを停止します
- タイマーが50ミリ秒の制限を超えた場合は、タイマーをオフにして、それ以降のすべてのデバイス入力をドロップします。
- デバイスが最初のシンボルからVK_ENTERまでの文字シーケンスを正常に読み取る場合-デバイスのVID&PID / handleを抽出し、より便利な方法で(タイマーなしで)操作します。
私はそれをC++、純粋なWinAPIで開発しており、DLLライブラリになり、x32-86およびx32-64アーキテクチャ上のWindows XP、Vista、7、8で動作するようになります。
更新0: バーコードスキャナーには独自のusagePageとUSB仕様での使用法があることがわかりました: http ://www.usb.org/developers/devclass_docs/pos1_02.pdf
このドキュメントによると、USBバーコードスキャナーにはUsagePage0x8CとUsage0x02があります。残念ながら、RAWINPUTDEVICE.dwUsageおよびRAWINPUTDEVICE.dwUsagePageとして使用できませんでした。おそらくシステムがその上にusbキーボードドライバーをインストールし、ユーザーモードでは実際のusbキーボードと見分けがつかないためです。おそらく、これらの値はカーネルモード環境で使用できます(オプションの1つは、hidフィルタードライバーを開発することです)。