GetRawInputDeviceInfo を RIDI_DEVICEINFO と組み合わせて (RID_DEVICE_INFO を取得しようとする) まったく機能していないように見えるという問題があります。
関数からエラー -1 が返されます。これは、RID_DEVICE_INFO を格納するのに十分なスペースがないことを意味するはずです。購入して、必要以上に増やしてみましたが、効果は同じです。
次の DLLImports を使用しました。
[DllImport("User32.dll")]
extern static uint GetRawInputDeviceInfo(IntPtr hDevice, uint uiCommand, IntPtr pData, ref uint pcbSize);
[DllImport("User32.dll")]
unsafe extern static uint GetRawInputDeviceInfo(IntPtr hDevice, uint uiCommand, IntPtr pData, IntPtr pcbSize);
どちらも結果はありませんが、RIDI_DEVICENAME でこれらを試してみると、どちらも問題なく動作します。この場合、次のように関数を呼び出します。
最初にサイズを取得します:GetRawInputDeviceInfo(rid.hDevice, RIDI_DEVICENAME, IntPtr.Zero, pSize);
その後 :GetRawInputDeviceInfo(rid.hDevice, RIDI_DEVICENAME, pData, pSize);
名前を取得します。どちらも正常に動作しますが、次のように関数を呼び出すと:
int intReturn = (int)GetRawInputDeviceInfo(rid.hDevice, RIDI_DEVICEINFO, IntPtr.Zero, pInfoSize);
intReturn = (int)GetRawInputDeviceInfo(rid.hDevice, RIDI_DEVICEINFO, pInfoData, pInfoSize);
次に、最初に intReturn に 0 を取得し、正しいサイズを取得することもできますが、-1 を返すと、PtrToStructure を実行すると、間違った一見ランダムな値が返されます。
また、その後 GetLastWin32Error() を実行すると、いつか 1008 または 87 が返されます。これは、間違ったパラメーターを作成した可能性がある場所がわからないため、ロジックを作成していないようです。
RIDI_DEVICENAME と RIDI_DEVICEINFO を次のように定義しました。
internal const uint RIDI_DEVICENAME = 0x20000007;
internal const uint RIDI_DEVICEINFO = 0x2000000b;
誰でもこの問題を解決したり、 GetRawInputDeviceInfo の動作する C# の例を見せたりできますか?
ありがとう、ピーター