398 lines
15 KiB
ObjectPascal
398 lines
15 KiB
ObjectPascal
{******************************************************************************}
|
|
{* *}
|
|
{* Copyright (C) Microsoft Corporation. All Rights Reserved. *}
|
|
{* *}
|
|
{* Files: XInput.h *}
|
|
{* Content: This module defines XBOX controller APIs *}
|
|
{* and constansts for the Windows platform. *}
|
|
{* *}
|
|
{* DirectX 9.0 Delphi / FreePascal adaptation by Alexey Barkovoy *}
|
|
{* E-Mail: directx@clootie.ru *}
|
|
{* *}
|
|
{* Latest version can be downloaded from: *}
|
|
{* http://www.clootie.ru *}
|
|
{* http://sourceforge.net/projects/delphi-dx9sdk *}
|
|
{* *}
|
|
{*----------------------------------------------------------------------------*}
|
|
{* $Id: XInput.pas,v 1.3 2006/10/21 21:30:10 clootie Exp $ }
|
|
{******************************************************************************}
|
|
{ }
|
|
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
|
|
{ }
|
|
{ The contents of this file are used with permission, subject to the Mozilla }
|
|
{ Public License Version 1.1 (the "License"); you may not use this file except }
|
|
{ in compliance with the License. You may obtain a copy of the License at }
|
|
{ http://www.mozilla.org/MPL/MPL-1.1.html }
|
|
{ }
|
|
{ Software distributed under the License is distributed on an "AS IS" basis, }
|
|
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
|
|
{ the specific language governing rights and limitations under the License. }
|
|
{ }
|
|
{ Alternatively, the contents of this file may be used under the terms of the }
|
|
{ GNU Lesser General Public License (the "LGPL License"), in which case the }
|
|
{ provisions of the LGPL License are applicable instead of those above. }
|
|
{ If you wish to allow use of your version of this file only under the terms }
|
|
{ of the LGPL License and not to allow others to use your version of this file }
|
|
{ under the MPL, indicate your decision by deleting the provisions above and }
|
|
{ replace them with the notice and other provisions required by the LGPL }
|
|
{ License. If you do not delete the provisions above, a recipient may use }
|
|
{ your version of this file under either the MPL or the LGPL License. }
|
|
{ }
|
|
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
|
|
{ }
|
|
{******************************************************************************}
|
|
|
|
{$I DirectX.inc}
|
|
|
|
unit XInput;
|
|
|
|
interface
|
|
|
|
(*$HPPEMIT '#include "XInput.h"' *)
|
|
|
|
uses
|
|
Windows;
|
|
|
|
const
|
|
// Current name of the DLL shipped in the same SDK as this header.
|
|
// The name reflects the current version
|
|
XINPUT_DLL_A = 'xinput1_3.dll';
|
|
{$EXTERNALSYM XINPUT_DLL_A}
|
|
XINPUT_DLL_W = 'xinput1_3.dll';
|
|
{$EXTERNALSYM XINPUT_DLL_W}
|
|
{$IFDEF UNICODE}
|
|
XINPUT_DLL = XINPUT_DLL_W;
|
|
{$ELSE}
|
|
XINPUT_DLL = XINPUT_DLL_A;
|
|
{$ENDIF}
|
|
{$EXTERNALSYM XINPUT_DLL}
|
|
|
|
//
|
|
// Device types available in XINPUT_CAPABILITIES
|
|
//
|
|
XINPUT_DEVTYPE_GAMEPAD = $01;
|
|
{$EXTERNALSYM XINPUT_DEVTYPE_GAMEPAD}
|
|
XINPUT_DEVSUBTYPE_WHEEL = $02;
|
|
{$EXTERNALSYM XINPUT_DEVSUBTYPE_WHEEL}
|
|
XINPUT_DEVSUBTYPE_ARCADE_STICK = $03;
|
|
{$EXTERNALSYM XINPUT_DEVSUBTYPE_ARCADE_STICK}
|
|
XINPUT_DEVSUBTYPE_FLIGHT_SICK = $04;
|
|
{$EXTERNALSYM XINPUT_DEVSUBTYPE_FLIGHT_SICK}
|
|
XINPUT_DEVSUBTYPE_DANCE_PAD = $05;
|
|
{$EXTERNALSYM XINPUT_DEVSUBTYPE_DANCE_PAD}
|
|
|
|
//
|
|
// Device subtypes available in XINPUT_CAPABILITIES
|
|
//
|
|
XINPUT_DEVSUBTYPE_GAMEPAD = $01;
|
|
{$EXTERNALSYM XINPUT_DEVSUBTYPE_GAMEPAD}
|
|
|
|
//
|
|
// Flags for XINPUT_CAPABILITIES
|
|
//
|
|
XINPUT_CAPS_VOICE_SUPPORTED = $0004;
|
|
{$EXTERNALSYM XINPUT_CAPS_VOICE_SUPPORTED}
|
|
|
|
//
|
|
// Constants for gamepad buttons
|
|
//
|
|
XINPUT_GAMEPAD_DPAD_UP = $0001;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_DPAD_UP}
|
|
XINPUT_GAMEPAD_DPAD_DOWN = $0002;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_DPAD_DOWN}
|
|
XINPUT_GAMEPAD_DPAD_LEFT = $0004;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_DPAD_LEFT}
|
|
XINPUT_GAMEPAD_DPAD_RIGHT = $0008;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_DPAD_RIGHT}
|
|
XINPUT_GAMEPAD_START = $0010;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_START}
|
|
XINPUT_GAMEPAD_BACK = $0020;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_BACK}
|
|
XINPUT_GAMEPAD_LEFT_THUMB = $0040;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_LEFT_THUMB}
|
|
XINPUT_GAMEPAD_RIGHT_THUMB = $0080;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_RIGHT_THUMB}
|
|
XINPUT_GAMEPAD_LEFT_SHOULDER = $0100;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_LEFT_SHOULDER}
|
|
XINPUT_GAMEPAD_RIGHT_SHOULDER = $0200;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_RIGHT_SHOULDER}
|
|
XINPUT_GAMEPAD_A = $1000;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_A}
|
|
XINPUT_GAMEPAD_B = $2000;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_B}
|
|
XINPUT_GAMEPAD_X = $4000;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_X}
|
|
XINPUT_GAMEPAD_Y = $8000;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_Y}
|
|
|
|
|
|
//
|
|
// Gamepad thresholds
|
|
//
|
|
XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE = 7849;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE}
|
|
XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE = 8689;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE}
|
|
XINPUT_GAMEPAD_TRIGGER_THRESHOLD = 30;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD_TRIGGER_THRESHOLD}
|
|
|
|
//
|
|
// Flags to pass to XInputGetCapabilities
|
|
//
|
|
XINPUT_FLAG_GAMEPAD = $00000001;
|
|
{$EXTERNALSYM XINPUT_FLAG_GAMEPAD}
|
|
|
|
//
|
|
// Devices that support batteries
|
|
//
|
|
BATTERY_DEVTYPE_GAMEPAD = $00;
|
|
{$EXTERNALSYM BATTERY_DEVTYPE_GAMEPAD}
|
|
BATTERY_DEVTYPE_HEADSET = $01;
|
|
{$EXTERNALSYM BATTERY_DEVTYPE_HEADSET}
|
|
|
|
//
|
|
// Flags for battery status level
|
|
//
|
|
BATTERY_TYPE_DISCONNECTED = $00; // This device is not connected
|
|
{$EXTERNALSYM BATTERY_TYPE_DISCONNECTED}
|
|
BATTERY_TYPE_WIRED = $01; // Wired device, no battery
|
|
{$EXTERNALSYM BATTERY_TYPE_WIRED}
|
|
BATTERY_TYPE_ALKALINE = $02; // Alkaline battery source
|
|
{$EXTERNALSYM BATTERY_TYPE_ALKALINE}
|
|
BATTERY_TYPE_NIMH = $03; // Nickel Metal Hydride battery source
|
|
{$EXTERNALSYM BATTERY_TYPE_NIMH}
|
|
BATTERY_TYPE_UNKNOWN = $FF; // Cannot determine the battery type
|
|
{$EXTERNALSYM BATTERY_TYPE_UNKNOWN}
|
|
|
|
// These are only valid for wireless, connected devices, with known battery types
|
|
// The amount of use time remaining depends on the type of device.
|
|
BATTERY_LEVEL_EMPTY = $00;
|
|
{$EXTERNALSYM BATTERY_LEVEL_EMPTY}
|
|
BATTERY_LEVEL_LOW = $01;
|
|
{$EXTERNALSYM BATTERY_LEVEL_LOW}
|
|
BATTERY_LEVEL_MEDIUM = $02;
|
|
{$EXTERNALSYM BATTERY_LEVEL_MEDIUM}
|
|
BATTERY_LEVEL_FULL = $03;
|
|
{$EXTERNALSYM BATTERY_LEVEL_FULL}
|
|
|
|
// User index definitions
|
|
XUSER_MAX_COUNT = 4;
|
|
{$EXTERNALSYM XUSER_MAX_COUNT}
|
|
|
|
XUSER_INDEX_ANY = $000000FF;
|
|
{$EXTERNALSYM XUSER_INDEX_ANY}
|
|
|
|
|
|
//
|
|
// Codes returned for the gamepad keystroke
|
|
//
|
|
|
|
VK_PAD_A = $5800;
|
|
{$EXTERNALSYM VK_PAD_A}
|
|
VK_PAD_B = $5801;
|
|
{$EXTERNALSYM VK_PAD_B}
|
|
VK_PAD_X = $5802;
|
|
{$EXTERNALSYM VK_PAD_X}
|
|
VK_PAD_Y = $5803;
|
|
{$EXTERNALSYM VK_PAD_Y}
|
|
VK_PAD_RSHOULDER = $5804;
|
|
{$EXTERNALSYM VK_PAD_RSHOULDER}
|
|
VK_PAD_LSHOULDER = $5805;
|
|
{$EXTERNALSYM VK_PAD_LSHOULDER}
|
|
VK_PAD_LTRIGGER = $5806;
|
|
{$EXTERNALSYM VK_PAD_LTRIGGER}
|
|
VK_PAD_RTRIGGER = $5807;
|
|
{$EXTERNALSYM VK_PAD_RTRIGGER}
|
|
|
|
VK_PAD_DPAD_UP = $5810;
|
|
{$EXTERNALSYM VK_PAD_DPAD_UP}
|
|
VK_PAD_DPAD_DOWN = $5811;
|
|
{$EXTERNALSYM VK_PAD_DPAD_DOWN}
|
|
VK_PAD_DPAD_LEFT = $5812;
|
|
{$EXTERNALSYM VK_PAD_DPAD_LEFT}
|
|
VK_PAD_DPAD_RIGHT = $5813;
|
|
{$EXTERNALSYM VK_PAD_DPAD_RIGHT}
|
|
VK_PAD_START = $5814;
|
|
{$EXTERNALSYM VK_PAD_START}
|
|
VK_PAD_BACK = $5815;
|
|
{$EXTERNALSYM VK_PAD_BACK}
|
|
VK_PAD_LTHUMB_PRESS = $5816;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_PRESS}
|
|
VK_PAD_RTHUMB_PRESS = $5817;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_PRESS}
|
|
|
|
VK_PAD_LTHUMB_UP = $5820;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_UP}
|
|
VK_PAD_LTHUMB_DOWN = $5821;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_DOWN}
|
|
VK_PAD_LTHUMB_RIGHT = $5822;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_RIGHT}
|
|
VK_PAD_LTHUMB_LEFT = $5823;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_LEFT}
|
|
VK_PAD_LTHUMB_UPLEFT = $5824;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_UPLEFT}
|
|
VK_PAD_LTHUMB_UPRIGHT = $5825;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_UPRIGHT}
|
|
VK_PAD_LTHUMB_DOWNRIGHT = $5826;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_DOWNRIGHT}
|
|
VK_PAD_LTHUMB_DOWNLEFT = $5827;
|
|
{$EXTERNALSYM VK_PAD_LTHUMB_DOWNLEFT}
|
|
|
|
VK_PAD_RTHUMB_UP = $5830;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_UP}
|
|
VK_PAD_RTHUMB_DOWN = $5831;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_DOWN}
|
|
VK_PAD_RTHUMB_RIGHT = $5832;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_RIGHT}
|
|
VK_PAD_RTHUMB_LEFT = $5833;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_LEFT}
|
|
VK_PAD_RTHUMB_UPLEFT = $5834;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_UPLEFT}
|
|
VK_PAD_RTHUMB_UPRIGHT = $5835;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_UPRIGHT}
|
|
VK_PAD_RTHUMB_DOWNRIGHT = $5836;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_DOWNRIGHT}
|
|
VK_PAD_RTHUMB_DOWNLEFT = $5837;
|
|
{$EXTERNALSYM VK_PAD_RTHUMB_DOWNLEFT}
|
|
|
|
//
|
|
// Flags used in XINPUT_KEYSTROKE
|
|
//
|
|
XINPUT_KEYSTROKE_KEYDOWN = $0001;
|
|
{$EXTERNALSYM XINPUT_KEYSTROKE_KEYDOWN}
|
|
XINPUT_KEYSTROKE_KEYUP = $0002;
|
|
{$EXTERNALSYM XINPUT_KEYSTROKE_KEYUP}
|
|
XINPUT_KEYSTROKE_REPEAT = $0004;
|
|
{$EXTERNALSYM XINPUT_KEYSTROKE_REPEAT}
|
|
|
|
type
|
|
|
|
//
|
|
// Structures used by XInput APIs
|
|
//
|
|
PXInputGamepad = ^TXInputGamepad;
|
|
_XINPUT_GAMEPAD = record
|
|
wButtons: Word;
|
|
bLeftTrigger: Byte;
|
|
bRightTrigger: Byte;
|
|
sThumbLX: Smallint;
|
|
sThumbLY: Smallint;
|
|
sThumbRX: Smallint;
|
|
sThumbRY: Smallint;
|
|
end;
|
|
{$EXTERNALSYM _XINPUT_GAMEPAD}
|
|
XINPUT_GAMEPAD = _XINPUT_GAMEPAD;
|
|
{$EXTERNALSYM XINPUT_GAMEPAD}
|
|
TXInputGamepad = XINPUT_GAMEPAD;
|
|
|
|
PXInputState = ^TXInputState;
|
|
_XINPUT_STATE = record
|
|
dwPacketNumber: DWORD;
|
|
Gamepad: TXInputGamepad;
|
|
end;
|
|
{$EXTERNALSYM _XINPUT_STATE}
|
|
XINPUT_STATE = _XINPUT_STATE;
|
|
{$EXTERNALSYM XINPUT_STATE}
|
|
TXInputState = XINPUT_STATE;
|
|
|
|
PXInputVibration = ^TXInputVibration;
|
|
_XINPUT_VIBRATION = record
|
|
wLeftMotorSpeed: Word;
|
|
wRightMotorSpeed: Word;
|
|
end;
|
|
{$EXTERNALSYM _XINPUT_VIBRATION}
|
|
XINPUT_VIBRATION = _XINPUT_VIBRATION;
|
|
{$EXTERNALSYM XINPUT_VIBRATION}
|
|
TXInputVibration = _XINPUT_VIBRATION;
|
|
|
|
PXInputCapabilities = ^TXInputCapabilities;
|
|
_XINPUT_CAPABILITIES = record
|
|
_Type: Byte;
|
|
SubType: Byte;
|
|
Flags: Word;
|
|
Gamepad: TXInputGamepad;
|
|
Vibration: TXInputVibration;
|
|
end;
|
|
{$EXTERNALSYM _XINPUT_CAPABILITIES}
|
|
XINPUT_CAPABILITIES = _XINPUT_CAPABILITIES;
|
|
{$EXTERNALSYM XINPUT_CAPABILITIES}
|
|
TXInputCapabilities = _XINPUT_CAPABILITIES;
|
|
|
|
PXInputBatteryInformation = ^TXInputBatteryInformation;
|
|
_XINPUT_BATTERY_INFORMATION = record
|
|
BatteryType: Byte;
|
|
BatteryLevel: Byte;
|
|
end;
|
|
{$EXTERNALSYM _XINPUT_BATTERY_INFORMATION}
|
|
XINPUT_BATTERY_INFORMATION = _XINPUT_BATTERY_INFORMATION;
|
|
{$EXTERNALSYM XINPUT_BATTERY_INFORMATION}
|
|
TXInputBatteryInformation = _XINPUT_BATTERY_INFORMATION;
|
|
|
|
PXInputKeystroke = ^TXInputKeystroke;
|
|
_XINPUT_KEYSTROKE = record
|
|
VirtualKey: Word;
|
|
Unicode: WideChar;
|
|
Flags: Word;
|
|
UserIndex: Byte;
|
|
HidCode: Byte;
|
|
end;
|
|
{$EXTERNALSYM _XINPUT_KEYSTROKE}
|
|
XINPUT_KEYSTROKE = _XINPUT_KEYSTROKE;
|
|
{$EXTERNALSYM XINPUT_KEYSTROKE}
|
|
TXInputKeystroke = _XINPUT_KEYSTROKE;
|
|
|
|
|
|
//
|
|
// XInput APIs
|
|
//
|
|
|
|
function XInputGetState(
|
|
dwUserIndex: DWORD; // [in] Index of the gamer associated with the device
|
|
out pState: TXInputState // [out] Receives the current state
|
|
): DWORD; stdcall; external XINPUT_DLL;
|
|
{$EXTERNALSYM XInputGetState}
|
|
|
|
function XInputSetState(
|
|
dwUserIndex: DWORD; // [in] Index of the gamer associated with the device
|
|
const pVibration: TXInputVibration // [in, out] The vibration information to send to the controller
|
|
): DWORD; stdcall; external XINPUT_DLL;
|
|
{$EXTERNALSYM XInputSetState}
|
|
|
|
function XInputGetCapabilities(
|
|
dwUserIndex: DWORD; // [in] Index of the gamer associated with the device
|
|
dwFlags: DWORD; // [in] Input flags that identify the device type
|
|
out pCapabilities: TXInputCapabilities // [out] Receives the capabilities
|
|
): DWORD; stdcall; external XINPUT_DLL;
|
|
{$EXTERNALSYM XInputGetCapabilities}
|
|
|
|
procedure XInputEnable(
|
|
enable: BOOL // [in] Indicates whether xinput is enabled or disabled.
|
|
); stdcall; external XINPUT_DLL;
|
|
{$EXTERNALSYM XInputEnable}
|
|
|
|
function XInputGetDSoundAudioDeviceGuids(
|
|
dwUserIndex: DWORD; // [in] Index of the gamer associated with the device
|
|
out pDSoundRenderGuid: TGUID; // [out] DSound device ID for render
|
|
out pDSoundCaptureGuid: TGUID // [out] DSound device ID for capture
|
|
): DWORD; stdcall; external XINPUT_DLL;
|
|
{$EXTERNALSYM XInputGetDSoundAudioDeviceGuids}
|
|
|
|
function XInputGetBatteryInformation(
|
|
dwUserIndex: DWORD; // [in] Index of the gamer associated with the device
|
|
devType: Byte; // [in] Which device on this user index
|
|
out pBatteryInformation: TXInputBatteryInformation // [out] Contains the level and types of batteries
|
|
): DWORD; stdcall; external XINPUT_DLL;
|
|
{$EXTERNALSYM XInputGetBatteryInformation}
|
|
|
|
function XInputGetKeystroke(
|
|
dwUserIndex: DWORD; // [in] Index of the gamer associated with the device
|
|
dwReserved: DWORD; // [in] Reserved for future use
|
|
var pKeystroke: TXInputKeystroke // [out] Pointer to an XINPUT_KEYSTROKE structure that receives an input event.
|
|
): DWORD; stdcall; external XINPUT_DLL;
|
|
{$EXTERNALSYM XInputGetKeystroke}
|
|
|
|
|
|
implementation
|
|
|
|
end.
|