c# .net input joystick human-interface

Tomando entrada de un joystick con C#.NET



input human-interface (4)

Busqué en Google por esto, pero las únicas cosas que se me ocurrieron estaban desactualizadas y no funcionaron.

¿Alguien tiene alguna información sobre cómo obtener datos del joystick utilizando C # .NET?


Google me condujo hasta aquí y aunque no es un requisito de esta pregunta, OpenTK es una buena opción para el soporte de Windows y Linux (bajo mono).

Desde los OpenTK , este código funciona en Raspberry Pi + Raspbian + Mono 3.12.0:

for (int i = 0; i < 4; i++) { var state = Joystick.GetState(i); if (state.IsConnected) { float x = state.GetAxis(JoystickAxis.Axis0); float y = state.GetAxis(JoystickAxis.Axis1); // Print the current state of the joystick Console.WriteLine(state); } }


La mala noticia es que Microsoft parece dejar de admitir sus bibliotecas NET para DirectX y, en cambio, se centra en XNA. No trabajo en GameDev, así que no necesito usar XNA, pero puedes intentarlo si estás desarrollando juegos de computadora. La buena noticia es que hay otros enfoques. Uno es SlimDX el nuevo marco para ayudarlo a trabajar con DirectX desde C #. La otra forma es agregar directamente referencias a "Microsoft.DirectX.dll" y "Microsoft.DirectX.DirectInput.dll" a su proyecto. puede encontrarlos ".. / Windows / Microsoft.NET / DirectX para código administrado /". Si va a utilizar el último enfoque, aquí hay un enlace a Codeproject donde puede leer cómo trabajar con un joystick.

EDITAR: Si su aplicación se basa en la versión NET más reciente, entonces la aplicación puede colgar. Para solucionar este problema, cambie el archivo de configuración y agregue esto:

<startup useLegacyV2RuntimeActivationPolicy="true">


Uno: usar SlimDX .

Dos: se ve algo como esto (donde GamepadDevice es mi propia envoltura, y el código se reduce a las partes relevantes).

Encuentra los GUIDs del joystick / pad:

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; }

Una vez que el usuario haya seleccionado de la lista, adquiera el 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(); }

El sondeo de la almohadilla se ve así:

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();


Ya que este fue el mayor éxito que obtuve en Google mientras buscaba la entrada del joystick / gamepad en C #, pensé que debería publicar una respuesta para que otros la vean.

La forma más fácil que encontré fue usar SharpDX y DirectInput. Puede instalarlo a través de NuGet (SharpDX.DirectInput)

Después de eso, es simplemente una cuestión de llamar a algunos métodos:

Código de muestra de SharpDX

static void Main() { // Initialize DirectInput var directInput = new DirectInput(); // Find a Joystick Guid var joystickGuid = Guid.Empty; foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad, DeviceEnumerationFlags.AllDevices)) joystickGuid = deviceInstance.InstanceGuid; // If Gamepad not found, look for a Joystick if (joystickGuid == Guid.Empty) foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick, DeviceEnumerationFlags.AllDevices)) joystickGuid = deviceInstance.InstanceGuid; // If Joystick not found, throws an error if (joystickGuid == Guid.Empty) { Console.WriteLine("No joystick/Gamepad found."); Console.ReadKey(); Environment.Exit(1); } // Instantiate the joystick var joystick = new Joystick(directInput, joystickGuid); Console.WriteLine("Found Joystick/Gamepad with GUID: {0}", joystickGuid); // Query all suported ForceFeedback effects var allEffects = joystick.GetEffects(); foreach (var effectInfo in allEffects) Console.WriteLine("Effect available {0}", effectInfo.Name); // Set BufferSize in order to use buffered data. joystick.Properties.BufferSize = 128; // Acquire the joystick joystick.Acquire(); // Poll events from joystick while (true) { joystick.Poll(); var datas = joystick.GetBufferedData(); foreach (var state in datas) Console.WriteLine(state); } }

Espero que esto ayude.

Incluso conseguí que esto funcionara con un DualShock3 y los controladores MotioninJoy.