SharpDX.DirectInputでPS4コントローラ(DUAL SHOCK 4)が取得できず困ったときに読む記事です。
概要
まずSharpDXがあります。
この記事を見ている人には説明不要そうですが、C#
で使えるDirectX
のラッパーですね。
今回はNuGetパッケージのSharpDX
とSharpDX.DirectInput
を使い、PS4コントローラを取得することをゴールとします。
NuGet Gallery | SharpDX.DirectInput 4.2.0
動かないコード
公式のサンプルコードです。
SharpDX-Samples/Program.cs at master · sharpdx/SharpDX-Samples · GitHub
このサンプル、XBox Oneコントローラは取得できますがDUAL SHOCK 4は取得できません。
その結果issueも立ってたりします。
動くコード
こうします。
using System; using System.Linq; using SharpDX.DirectInput; using DeviceType = SharpDX.DirectInput.DeviceType; // ... void GetController(IntPtr wHandle) { var directInput = new DirectInput(); //使えそうなデバイスをGamepad, Joystick, どっちも無ければGameControlクラス、という順に探す。 var devices = directInput .GetDevices(DeviceType.Gamepad, DeviceEnumerationFlags.AllDevices) .Concat(directInput.GetDevices(DeviceType.Joystick, DeviceEnumerationFlags.AllDevices)) .Concat(directInput.GetDevices(DeviceClass.GameControl, DeviceEnumerationFlags.AllDevices)) .ToList(); if (devices.Count == 0) { //デバイスが見つからないので諦める directInput.Dispose(); return; } var joystickGuid = devices[0].InstanceGuid; joystick = new Joystick(directInput, joystickGuid); //バックグラウンドで非占有にする joystick.SetCooperativeLevel(wHandle, CooperativeLevel.Background | CooperativeLevel.NonExclusive); //占有したいならこう //joystick.SetCooperativeLevel(wHandle, CooperativeLevel.Foreground | CooperativeLevel.Exclusive); joystick.Acquire(); }
何が違うの
本質的にはDeviceClass.GameControl
でのデバイス検索が増えてるだけです。
var gameControlDevices = directInput.GetDevices(DeviceClass.GameControl, DeviceEnumerationFlags.AllDevices);
DUAL SHOCK 4はDeviceType.Gamepad
とかDeviceType.Joystick
では取得出来ない事があるので対策しとこうね、と。
まとめ
SharpDX.DirectInputでPS4コントローラ(DUAL SHOCK 4)が取得できず困った人が本記事で助かるといいなあと思いました。
案外誰も書いてなさそうだったので書いたのですが、そもそも「2020年になってDirectInputってどうなんだ」という話もあります…はい…。