Search code examples
c#.netinputjoystickhuman-interface

Taking input from a joystick with C# .NET


I searched around on Google for this, but the only things I came up with were outdated and did not work.

Does anyone have any information on how to get joystick data using C# .NET?


Solution

  • One: use SlimDX.

    Two: it looks something like this (where GamepadDevice is my own wrapper, and the code is slimmed down to just the relevant parts).

    Find the joystick / pad GUIDs:

        public virtual IList<GamepadDevice> Available()
        {
            IList<GamepadDevice> result = new List<GamepadDevice>();
            DirectInput dinput = new DirectInput();
            foreach (DeviceInstance di in dinput.GetDevices(DeviceClass.GameController, DeviceEnumerationFlags.AttachedOnly))
            {
                GamepadDevice dev = new GamepadDevice();
                dev.Guid = di.InstanceGuid;
                dev.Name = di.InstanceName;
                result.Add(dev);
            }
            return result;
        }
    

    Once the user has selected from the list, acquire the gamepad:

       private void acquire(System.Windows.Forms.Form parent)
        {
            DirectInput dinput = new DirectInput();
    
            pad = new Joystick(dinput, this.Device.Guid);
            foreach (DeviceObjectInstance doi in pad.GetObjects(ObjectDeviceType.Axis))
            {
                pad.GetObjectPropertiesById((int)doi.ObjectType).SetRange(-5000, 5000);
            }
    
            pad.Properties.AxisMode = DeviceAxisMode.Absolute;
            pad.SetCooperativeLevel(parent, (CooperativeLevel.Nonexclusive | CooperativeLevel.Background));
            pad.Acquire();
        }
    

    Polling the pad looks like this:

            JoystickState state = new JoystickState();
    
            if (pad.Poll().IsFailure)
            {
                result.Disconnect = true;
                return result;
            }
    
            if (pad.GetCurrentState(ref state).IsFailure)
            {
                result.Disconnect = true;
                return result;
            }
    
            result.X = state.X / 5000.0f;
            result.Y = state.Y / 5000.0f;
            int ispressed = 0;
            bool[] buttons = state.GetButtons();