10

ゲームパッドの処理のために、アプリケーションを DirectInput から RawInput に切り替えています。各ゲームパッドについて、人間が読める説明を表示したいと考えています。理想はデバイス マネージャーに表示されるデバイス テキストですが、USB 製品の説明でも構いません。どの方法でも、管理者の許可がなくても機能するはずです。

これまでのところ、1 つの手がかりHKLM\SYSTEM\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEMを見つけました。レジストリに、DirectInput によって提供された名前と同じテキスト フィールドがあるようです。これは完璧ではありません。デバイス マネージャーに英語で表示されるゲームパッドがありますが、レジストリには「氀」と表示されます。

によって提供される HANDLE からWM_INPUTデバイス マネージャーの説明を取得する方法はありますか? HidD_GetProductString有望に見えますが、RawInput ハンドルから Hid トップレベル コレクション ハンドルを取得する方法がわかりません。

編集: デバイス インスタンス パスを取得しました (たとえば\\?\HID#VID_1267&PID_A001#8&1d630df6&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}、SetupAPI から必要な情報を抽出するのに十分な場合があります。インスタンス パスを指定してこれに到達する方法を知っている人はいますか?

4

3 に答える 3

4

私は同様の問題を抱えており、潜在的な解決策を見つけたと信じています。

パラメータの引数として、CreateFileRawInput が呼び出しから提供する名前でGetRawInputDeviceInfo呼び出す必要があるようです。これにより、 を呼び出すことができるデバイスへのハンドルが得られます。RIDI_DEVICENAMEuiCommandHidD_GetProductString

wchar_t DeviceName[126];
HANDLE HIDHandle = CreateFile(RawInputDeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
if(HIDHandle)
{
    BOOLEAN Result = HidD_GetProductString(HIDHandle, DeviceName, sizeof(wchar_t) * 126);
    CloseHandle(HIDHandle);
}

ただし、HidD_GetProductStringシステムに接続されているデバイスの大部分では失敗するようで、USB キーボードと Web カメラでしか成功しないようです。私の USB マウスではうまくいきません。これがなぜなのかはまだわかりませんが、おそらく私の進歩があなたを助けるでしょう.

于 2012-11-18T22:18:04.957 に答える