私はバーコード スキャナー (キーボードのように機能します) を持っています。もちろん、コンピューターに接続しすぎているキーボードもあります。ソフトウェアはスキャナとキーボードの両方からの入力を受け入れています。スキャナーの入力のみを受け入れる必要があります。コードは C# で記述されています。キーボードからの入力を「無効」にして、スキャナからの入力のみを受け入れる方法はありますか?
注: キーボードはラップトップの一部であるため、プラグを抜くことはできません。また、次のコード protected override Boolean ProcessDialogKey(System.Windows.Forms.Keys keyData) { return true; を入れてみました。ただし、キーボードからのキーストロークを無視するだけでなく、バーコード スキャナーの入力も無視されます。
スキャナーが他のアプリケーションで使用されており、センチメンタル文字ストリームを追加すると他のコードを変更することになるため、スキャナーにセンチメンタル文字を送信させることはできません。
また、スキャンされたバーコードは単一文字のバーコードである可能性があるため、入力がバーコード スキャナーからのものかどうかを判断するタイミング方法を使用できません (一連の文字の後に一時停止が続く場合)。
はい、ストリームからデータを読み取っています。
私は記事をフォローしようとしています: WinForms のキーボードからバーコード スキャナーを区別する。ただし、次の質問があります。
- 保護レベルが原因で、NativeMethods にアクセスできませんというエラーが表示されます。dll をインポートする必要があるようです。これは正しいです?もしそうなら、どうすればいいですか?
- どの protected override void WndProc(ref Message m) 定義を使用する必要がありますか?記事には 2 つの実装がありますか?
- [SecurityPermission( SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] エラー CS0246: The type or namespace name 'SecurityPermission' could not be found (using ディレクティブまたはアセンブリ参照がありませんか?) に関連するエラーが発生しています。このエラーを解決するにはどうすればよいですか?
- if ((from hardwareId in hardwareIds where deviceName.Contains(hardwareId) select hardwareId).Count() > 0) Error is error CS1026: ) expected を含む行にもエラーがあります。
- この記事のすべてのコードを BarcodeScannerListener.cs という 1 つの .cs ファイルに配置する必要がありますか?
Nicholas Piasecki によってhttp://nicholas.piasecki.name/blog/2009/02/distinguishing-barcode-scanners-from-the-keyboard-in-winforms/に投稿された C# ソリューション ソース コードに関するフォローアップの質問:
- VS 2005 でソリューションを開くことができなかったので、Visual C# 2008 Express Edition をダウンロードし、コードを実行しました。しかし、バーコード スキャナを接続してバーコードをスキャンした後、プログラムはスキャンを認識しませんでした。OnBarcodeScanned メソッドにブレークポイントを設定しましたが、ヒットしませんでした。デバイス マネージャーを使用して取得したバーコード スキャナーの ID で App.config を変更しました。HID#Vid_0536&Pid_01c1 を持つ 2 つの deviceNames があるようです (これは、スキャナーが接続されているときにデバイス マネージャーから取得されます)。これが原因でスキャンが機能しないかどうかはわかりません。deviceNames を反復処理するときに、見つけたデバイスのリストを次に示します (デバッガーを使用)。
"\??\HID#Vid_0536&Pid_01c1&MI_01#9&25ca5370&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"
"\??\HID#Vid_0536&Pid_01c1&MI_00#9&38e10b9&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\HID#Vid_413c&Pid_2101&MI_00#8&1966e83d&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"
"\??\HID#Vid_413c&Pid_3012#7&960fae0&0&0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}"
"\??\Root#RDP_KBD#0000#{884b96c3-56ef-11d1-bc8c-00a0c91405""?dd} \ACPI#PNP0303#4&2f94427b&0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}" "\??\Root#RDP_MOU#0000#{378de44c-56ef-11d1-bc8c-00a0c91405dd}" "\??\ACPI#PNP0F13 #4&2f94427b&0#{378de44c-56ef-11d1-bc8c-00a0c91405dd}"
したがって、HID#Vid_0536&Pid_01c1 には 2 つのエントリがあります。それが原因でスキャンが機能しない可能性はありますか?
わかりましたので、スキャナーが送信する ASCII 0x04 文字に依存しない方法を見つけなければならなかったようです...私のスキャナーはその文字を送信しないためです。その後、バーコード スキャン イベントが発生し、バーコードを含むポップアップが表示されます。ニコラス、助けてくれてありがとう。