Bakulog

獏の夢日記的な何か。

SharpDX.DirectInputでPS4コントローラ(DUAL SHOCK 4)が取得できず困ったときに読む記事

SharpDX.DirectInputPS4コントローラ(DUAL SHOCK 4)が取得できず困ったときに読む記事です。

概要

まずSharpDXがあります。

github.com

この記事を見ている人には説明不要そうですが、C#で使えるDirectXのラッパーですね。

今回はNuGetパッケージのSharpDXSharpDX.DirectInputを使い、PS4コントローラを取得することをゴールとします。

NuGet Gallery | SharpDX 4.2.0

NuGet Gallery | SharpDX.DirectInput 4.2.0

 

動かないコード

公式のサンプルコードです。

SharpDX-Samples/Program.cs at master · sharpdx/SharpDX-Samples · GitHub

このサンプル、XBox Oneコントローラは取得できますがDUAL SHOCK 4は取得できません

その結果issueも立ってたりします。

Following the DirectInput example but joystickGUID stays empty · Issue #38 · sharpdx/SharpDX-Samples · GitHub

 

動くコード

こうします。

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.DirectInputPS4コントローラ(DUAL SHOCK 4)が取得できず困った人が本記事で助かるといいなあと思いました。

案外誰も書いてなさそうだったので書いたのですが、そもそも「2020年になってDirectInputってどうなんだ」という話もあります…はい…。