3

多くの USB デバイスには一意のシリアル番号 (実際には Unicode 文字列) が含まれており、ホストはこれを 16 ビットのベンダーおよび製品 ID 番号と組み合わせて使用​​して、デバイスを一意に識別できます。

システムに接続されているすべての USB ヒューマン インターフェイス デバイスのリストを表示できる Windows アプリケーションを作成する方法を見つけようとしています。リストには、システム キーボードを含む HID ごとに 1 つの行があります。リストには、ベンダー ID、製品 ID、およびシリアル番号の列があります。

SetupDiGetClassDevsから返された GUIDを使用して呼び出しHidD_GetHidGuid、 を繰り返し呼び出して結果をループすることで、USB HID のリストを取得できますSetupDiEnumDeviceInterfaces。その後、 を呼び出しSetupDiGetDeviceInterfaceDetailて各デバイスへのパスを取得できます。パスは で開くことができますがCreateFile、システム キーボードでは拒否される読み取り権限も書き込み権限も要求しないように注意する必要があります。そこから を呼び出して、ベンダーと製品の ID 番号を取得できますHidD_GetAttributes

シリアル番号の文字列を取得する方法がわかりません。この問題の解決策を検索すると、USB 大容量記憶装置デバイスのシリアル番号を取得する方法に関する多くの情報が見つかりますが、他のタイプの USB デバイスに適用できると思われるものは何もありません。シリアル番号文字列を取得するための一般的な方法または HID 固有の方法を発見できれば幸いです。

の Win32 ポートlibusbならそれほど問題なくこれを管理できると思いますが、残念ながら、上記の関数を含むsetupapiやDLL など、Windows に付属のライブラリのみに依存するソリューションが必要です。hid

どんな提案でも大歓迎です!

4

5 に答える 5

5

上記のように取得したハンドルを指定すると、まさに私が望むことをHID.dll行う関数が呼び出されることがわかります。試してみただけで、うまく機能します。また、デバイス記述子で参照される他の文字列記述子を取得する関数や、インデックスを指定して任意の文字列記述子を取得する関数もあります (おそらく、HID 記述子に文字列記述子インデックスを含めることが許可されているため) 。私は今、かなりばかげていると感じています-答えはずっと私の鼻の下にありました。HidD_GetSerialNumberStringCreateFileHidD_GetManufacturerStringHidD_GetProductStringHidD_GetIndexedString

私の質問を読んで答えてくれてありがとう!Alphaneo の回答は非常に有望に思えます。実際、この回答に出くわしたとき、DDK がダウンロードされるのを待っていました。

于 2009-04-23T04:19:45.480 に答える
0

GetVolumeInformation接続されているハードウェアのシリアル番号を取得するために使用できます。

于 2010-03-08T09:37:05.090 に答える
0

この本USB Completeをお勧めします。第 4 章列挙: ホストがデバイスについて学習する方法には、必要な情報があります。

このページには、情報への多くのリンクと、使用できるライブラリとユーティリティへのリンクがあります。

于 2009-04-13T18:09:10.817 に答える
0

Hid キーボードの入力レコード、出力レコード、機能レコードの HID 定義のドキュメントを検索してみましたか。これにより、HID を介してキーボードから出入りできる「もの」のリストが表示されます。

また、ソフトウェアで HID レコード定義を列挙できることも知っています。1年ほど前に似たようなことをしたのですが、頭のてっぺんの詳細を思い出せません。そうすることで、キーボード USB クラスが標準インターフェイスとして公開しているものを確認できます。

あなたが探しているものを見つけるためのいくつかの指針を得ることができれば幸いです. 申し訳ありませんが、これ以上正確に言えませんでした!

于 2009-04-09T12:51:13.993 に答える