ScpControl.Shared/XInput/XInputConstants.cs (129 lines of code) (raw):
using System;
using System.Runtime.InteropServices;
namespace ScpControl.Shared.XInput
{
#region Native structs
[StructLayout(LayoutKind.Sequential)]
public struct XINPUT_GAMEPAD
{
public ushort wButtons;
public byte bLeftTrigger;
public byte bRightTrigger;
public short sThumbLX;
public short sThumbLY;
public short sThumbRX;
public short sThumbRY;
}
[StructLayout(LayoutKind.Sequential)]
public struct XINPUT_STATE
{
public uint dwPacketNumber;
public XINPUT_GAMEPAD Gamepad;
}
[StructLayout(LayoutKind.Sequential)]
public struct XINPUT_VIBRATION
{
public uint wLeftMotorSpeed;
public uint wRightMotorSpeed;
}
[StructLayout(LayoutKind.Sequential)]
public struct XINPUT_CAPABILITIES
{
public byte Type;
public byte SubType;
public ushort Flags;
public XINPUT_GAMEPAD Gamepad;
public XINPUT_VIBRATION Vibration;
}
[StructLayout(LayoutKind.Sequential)]
public struct XINPUT_BATTERY_INFORMATION
{
public byte BatteryType;
public byte BatteryLevel;
}
[StructLayout(LayoutKind.Sequential)]
public struct XINPUT_KEYSTROKE
{
public ushort VirtualKey;
public char Unicode;
public ushort Flags;
public byte UserIndex;
public byte HidCode;
}
public static class ResultWin32
{
/// <summary>
/// The operation completed successfully.
/// </summary>
public const int ERROR_SUCCESS = 0;
/// <summary>
/// The device is not connected.
/// </summary>
public const int ERROR_DEVICE_NOT_CONNECTED = 1167;
}
[Flags]
public enum ButtonFlags : int
{
XINPUT_GAMEPAD_DPAD_UP = 0x0001,
XINPUT_GAMEPAD_DPAD_DOWN = 0x0002,
XINPUT_GAMEPAD_DPAD_LEFT = 0x0004,
XINPUT_GAMEPAD_DPAD_RIGHT = 0x0008,
XINPUT_GAMEPAD_START = 0x0010,
XINPUT_GAMEPAD_BACK = 0x0020,
XINPUT_GAMEPAD_LEFT_THUMB = 0x0040,
XINPUT_GAMEPAD_RIGHT_THUMB = 0x0080,
XINPUT_GAMEPAD_LEFT_SHOULDER = 0x0100,
XINPUT_GAMEPAD_RIGHT_SHOULDER = 0x0200,
XINPUT_GAMEPAD_A = 0x1000,
XINPUT_GAMEPAD_B = 0x2000,
XINPUT_GAMEPAD_X = 0x4000,
XINPUT_GAMEPAD_Y = 0x8000,
};
[Flags]
public enum ControllerSubtypes
{
XINPUT_DEVSUBTYPE_UNKNOWN = 0x00,
XINPUT_DEVSUBTYPE_WHEEL = 0x02,
XINPUT_DEVSUBTYPE_ARCADE_STICK = 0x03,
XINPUT_DEVSUBTYPE_FLIGHT_STICK = 0x04,
XINPUT_DEVSUBTYPE_DANCE_PAD = 0x05,
XINPUT_DEVSUBTYPE_GUITAR = 0x06,
XINPUT_DEVSUBTYPE_GUITAR_ALTERNATE = 0x07,
XINPUT_DEVSUBTYPE_DRUM_KIT = 0x08,
XINPUT_DEVSUBTYPE_GUITAR_BASS = 0x0B,
XINPUT_DEVSUBTYPE_ARCADE_PAD = 0x13
};
public enum BatteryTypes : byte
{
//
// Flags for battery status level
//
BATTERY_TYPE_DISCONNECTED = 0x00, // This device is not connected
BATTERY_TYPE_WIRED = 0x01, // Wired device, no battery
BATTERY_TYPE_ALKALINE = 0x02, // Alkaline battery source
BATTERY_TYPE_NIMH = 0x03, // Nickel Metal Hydride battery source
BATTERY_TYPE_UNKNOWN = 0xFF, // Cannot determine the battery type
};
// These are only valid for wireless, connected devices, with known battery types
// The amount of use time remaining depends on the type of device.
public enum BatteryLevel : byte
{
BATTERY_LEVEL_EMPTY = 0x00,
BATTERY_LEVEL_LOW = 0x01,
BATTERY_LEVEL_MEDIUM = 0x02,
BATTERY_LEVEL_FULL = 0x03
};
public enum BatteryDeviceType : byte
{
BATTERY_DEVTYPE_GAMEPAD = 0x00,
BATTERY_DEVTYPE_HEADSET = 0x01,
}
public class XInputConstants
{
public const int XINPUT_DEVTYPE_GAMEPAD = 0x01;
//
// Device subtypes available in XINPUT_CAPABILITIES
//
public const int XINPUT_DEVSUBTYPE_GAMEPAD = 0x01;
//
// Flags for XINPUT_CAPABILITIES
//
[Flags]
public enum CapabilityFlags
{
XINPUT_CAPS_VOICE_SUPPORTED = 0x0004,
//For Windows 8 only
XINPUT_CAPS_FFB_SUPPORTED = 0x0001,
XINPUT_CAPS_WIRELESS = 0x0002,
XINPUT_CAPS_PMD_SUPPORTED = 0x0008,
XINPUT_CAPS_NO_NAVIGATION = 0x0010,
};
//
// Constants for gamepad buttons
//
//
// Gamepad thresholds
//
public const int XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE = 7849;
public const int XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE = 8689;
public const int XINPUT_GAMEPAD_TRIGGER_THRESHOLD = 30;
//
// Flags to pass to XInputGetCapabilities
//
public const int XINPUT_FLAG_GAMEPAD = 0x00000001;
}
#endregion
}