home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 May / PCP163A.iso / Runimage / Cbuilder4 / Include / DINPUT.H < prev    next >
Encoding:
C/C++ Source or Header  |  1999-01-26  |  72.8 KB  |  1,886 lines

  1. #pragma option push -b -a8 -pc -A- /*P_O_Push_S*/
  2. /****************************************************************************
  3.  *
  4.  *  Copyright (C) 1996-1997 Microsoft Corporation.  All Rights Reserved.
  5.  *
  6.  *  File:       dinput.h
  7.  *  Content:    DirectInput include file
  8.  *
  9.  ****************************************************************************/
  10.  
  11. #ifndef __DINPUT_INCLUDED__
  12. #define __DINPUT_INCLUDED__
  13.  
  14. #ifndef DIJ_RINGZERO
  15.  
  16. #ifdef _WIN32
  17. #define COM_NO_WINDOWS_H
  18. #include <objbase.h>
  19. #endif
  20.  
  21. #endif /* DIJ_RINGZERO */
  22.  
  23. #ifdef __cplusplus
  24. extern "C" {
  25. #endif
  26.  
  27. #ifndef DIRECTINPUT_VERSION
  28. #define DIRECTINPUT_VERSION         0x0500
  29. #endif
  30.  
  31. #ifndef DIJ_RINGZERO
  32. /****************************************************************************
  33.  *
  34.  *      Class IDs
  35.  *
  36.  ****************************************************************************/
  37.  
  38. DEFINE_GUID(CLSID_DirectInput,      0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  39. DEFINE_GUID(CLSID_DirectInputDevice,0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  40.  
  41. /****************************************************************************
  42.  *
  43.  *      Interfaces
  44.  *
  45.  ****************************************************************************/
  46.  
  47. DEFINE_GUID(IID_IDirectInputA,     0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  48. DEFINE_GUID(IID_IDirectInputW,     0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  49. DEFINE_GUID(IID_IDirectInput2A,    0x5944E662,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  50. DEFINE_GUID(IID_IDirectInput2W,    0x5944E663,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  51.  
  52. DEFINE_GUID(IID_IDirectInputDeviceA, 0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  53. DEFINE_GUID(IID_IDirectInputDeviceW, 0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  54. DEFINE_GUID(IID_IDirectInputDevice2A,0x5944E682,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  55. DEFINE_GUID(IID_IDirectInputDevice2W,0x5944E683,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  56.  
  57. DEFINE_GUID(IID_IDirectInputEffect,  0xE7E1F7C0,0x88D2,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  58.  
  59. /****************************************************************************
  60.  *
  61.  *      Predefined object types
  62.  *
  63.  ****************************************************************************/
  64.  
  65. DEFINE_GUID(GUID_XAxis,   0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  66. DEFINE_GUID(GUID_YAxis,   0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  67. DEFINE_GUID(GUID_ZAxis,   0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  68. DEFINE_GUID(GUID_RxAxis,  0xA36D02F4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  69. DEFINE_GUID(GUID_RyAxis,  0xA36D02F5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  70. DEFINE_GUID(GUID_RzAxis,  0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  71. DEFINE_GUID(GUID_Slider,  0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  72.  
  73. DEFINE_GUID(GUID_Button,  0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  74. DEFINE_GUID(GUID_Key,     0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  75.  
  76. DEFINE_GUID(GUID_POV,     0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  77.  
  78. DEFINE_GUID(GUID_Unknown, 0xA36D02F3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  79.  
  80. /****************************************************************************
  81.  *
  82.  *      Predefined product GUIDs
  83.  *
  84.  ****************************************************************************/
  85.  
  86. DEFINE_GUID(GUID_SysMouse,   0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  87. DEFINE_GUID(GUID_SysKeyboard,0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  88. DEFINE_GUID(GUID_Joystick   ,0x6F1D2B70,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
  89. /****************************************************************************
  90.  *
  91.  *      Predefined force feedback effects
  92.  *
  93.  ****************************************************************************/
  94.  
  95. DEFINE_GUID(GUID_ConstantForce,0x13541C20,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  96. DEFINE_GUID(GUID_RampForce,    0x13541C21,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  97. DEFINE_GUID(GUID_Square,       0x13541C22,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  98. DEFINE_GUID(GUID_Sine,         0x13541C23,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  99. DEFINE_GUID(GUID_Triangle,     0x13541C24,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  100. DEFINE_GUID(GUID_SawtoothUp,   0x13541C25,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  101. DEFINE_GUID(GUID_SawtoothDown, 0x13541C26,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  102. DEFINE_GUID(GUID_Spring,       0x13541C27,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  103. DEFINE_GUID(GUID_Damper,       0x13541C28,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  104. DEFINE_GUID(GUID_Inertia,      0x13541C29,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  105. DEFINE_GUID(GUID_Friction,     0x13541C2A,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  106. DEFINE_GUID(GUID_CustomForce,  0x13541C2B,0x8E33,0x11D0,0x9A,0xD0,0x00,0xA0,0xC9,0xA0,0x6E,0x35);
  107.  
  108.  
  109. #endif /* DIJ_RINGZERO */
  110.  
  111. /****************************************************************************
  112.  *
  113.  *      Interfaces and Structures...
  114.  *
  115.  ****************************************************************************/
  116.  
  117. #if(DIRECTINPUT_VERSION >= 0x0500)
  118.  
  119. /****************************************************************************
  120.  *
  121.  *      IDirectInputEffect
  122.  *
  123.  ****************************************************************************/
  124.  
  125. #define DIEFT_ALL                   0x00000000
  126.  
  127. #define DIEFT_CONSTANTFORCE         0x00000001
  128. #define DIEFT_RAMPFORCE             0x00000002
  129. #define DIEFT_PERIODIC              0x00000003
  130. #define DIEFT_CONDITION             0x00000004
  131. #define DIEFT_CUSTOMFORCE           0x00000005
  132. #define DIEFT_HARDWARE              0x000000FF
  133. #define DIEFT_FFATTACK              0x00000200
  134. #define DIEFT_FFFADE                0x00000400
  135. #define DIEFT_SATURATION            0x00000800
  136. #define DIEFT_POSNEGCOEFFICIENTS    0x00001000
  137. #define DIEFT_POSNEGSATURATION      0x00002000
  138. #define DIEFT_DEADBAND              0x00004000
  139.  
  140. #define DIEFT_GETTYPE(n)            LOBYTE(n)
  141.  
  142. #define DI_DEGREES                  100
  143. #define DI_FFNOMINALMAX             10000
  144. #define DI_SECONDS                  1000000
  145.  
  146. typedef struct DICONSTANTFORCE {
  147.     LONG  lMagnitude;
  148. } DICONSTANTFORCE, *LPDICONSTANTFORCE;
  149. typedef const DICONSTANTFORCE *LPCDICONSTANTFORCE;
  150.  
  151. typedef struct DIRAMPFORCE {
  152.     LONG  lStart;
  153.     LONG  lEnd;
  154. } DIRAMPFORCE, *LPDIRAMPFORCE;
  155. typedef const DIRAMPFORCE *LPCDIRAMPFORCE;
  156.  
  157. typedef struct DIPERIODIC {
  158.     DWORD dwMagnitude;
  159.     LONG  lOffset;
  160.     DWORD dwPhase;
  161.     DWORD dwPeriod;
  162. } DIPERIODIC, *LPDIPERIODIC;
  163. typedef const DIPERIODIC *LPCDIPERIODIC;
  164.  
  165. typedef struct DICONDITION {
  166.     LONG  lOffset;
  167.     LONG  lPositiveCoefficient;
  168.     LONG  lNegativeCoefficient;
  169.     DWORD dwPositiveSaturation;
  170.     DWORD dwNegativeSaturation;
  171.     LONG  lDeadBand;
  172. } DICONDITION, *LPDICONDITION;
  173. typedef const DICONDITION *LPCDICONDITION;
  174.  
  175. typedef struct DICUSTOMFORCE {
  176.     DWORD cChannels;
  177.     DWORD dwSamplePeriod;
  178.     DWORD cSamples;
  179.     LPLONG rglForceData;
  180. } DICUSTOMFORCE, *LPDICUSTOMFORCE;
  181. typedef const DICUSTOMFORCE *LPCDICUSTOMFORCE;
  182.  
  183. typedef struct DIENVELOPE {
  184.     DWORD dwSize;                   /* sizeof(DIENVELOPE)   */
  185.     DWORD dwAttackLevel;
  186.     DWORD dwAttackTime;             /* Microseconds         */
  187.     DWORD dwFadeLevel;
  188.     DWORD dwFadeTime;               /* Microseconds         */
  189. } DIENVELOPE, *LPDIENVELOPE;
  190. typedef const DIENVELOPE *LPCDIENVELOPE;
  191.  
  192. typedef struct DIEFFECT {
  193.     DWORD dwSize;                   /* sizeof(DIEFFECT)     */
  194.     DWORD dwFlags;                  /* DIEFF_*              */
  195.     DWORD dwDuration;               /* Microseconds         */
  196.     DWORD dwSamplePeriod;           /* Microseconds         */
  197.     DWORD dwGain;
  198.     DWORD dwTriggerButton;          /* or DIEB_NOTRIGGER    */
  199.     DWORD dwTriggerRepeatInterval;  /* Microseconds         */
  200.     DWORD cAxes;                    /* Number of axes       */
  201.     LPDWORD rgdwAxes;               /* Array of axes        */
  202.     LPLONG rglDirection;            /* Array of directions  */
  203.     LPDIENVELOPE lpEnvelope;        /* Optional             */
  204.     DWORD cbTypeSpecificParams;     /* Size of params       */
  205.     LPVOID lpvTypeSpecificParams;   /* Pointer to params    */
  206. } DIEFFECT, *LPDIEFFECT;
  207. typedef const DIEFFECT *LPCDIEFFECT;
  208.  
  209. #define DIEFF_OBJECTIDS             0x00000001
  210. #define DIEFF_OBJECTOFFSETS         0x00000002
  211. #define DIEFF_CARTESIAN             0x00000010
  212. #define DIEFF_POLAR                 0x00000020
  213. #define DIEFF_SPHERICAL             0x00000040
  214.  
  215. #define DIEP_DURATION               0x00000001
  216. #define DIEP_SAMPLEPERIOD           0x00000002
  217. #define DIEP_GAIN                   0x00000004
  218. #define DIEP_TRIGGERBUTTON          0x00000008
  219. #define DIEP_TRIGGERREPEATINTERVAL  0x00000010
  220. #define DIEP_AXES                   0x00000020
  221. #define DIEP_DIRECTION              0x00000040
  222. #define DIEP_ENVELOPE               0x00000080
  223. #define DIEP_TYPESPECIFICPARAMS     0x00000100
  224. #define DIEP_ALLPARAMS              0x000001FF
  225. #define DIEP_START                  0x20000000
  226. #define DIEP_NORESTART              0x40000000
  227. #define DIEP_NODOWNLOAD             0x80000000
  228. #define DIEB_NOTRIGGER              0xFFFFFFFF
  229.  
  230. #define DIES_SOLO                   0x00000001
  231. #define DIES_NODOWNLOAD             0x80000000
  232.  
  233. #define DIEGES_PLAYING              0x00000001
  234. #define DIEGES_EMULATED             0x00000002
  235.  
  236. typedef struct DIEFFESCAPE {
  237.     DWORD   dwSize;
  238.     DWORD   dwCommand;
  239.     LPVOID  lpvInBuffer;
  240.     DWORD   cbInBuffer;
  241.     LPVOID  lpvOutBuffer;
  242.     DWORD   cbOutBuffer;
  243. } DIEFFESCAPE, *LPDIEFFESCAPE;
  244.  
  245. #ifndef DIJ_RINGZERO
  246.  
  247. #undef INTERFACE
  248. #define INTERFACE IDirectInputEffect
  249.  
  250. DECLARE_INTERFACE_(IDirectInputEffect, IUnknown)
  251. {
  252.     /*** IUnknown methods ***/
  253.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  254.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  255.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  256.  
  257.     /*** IDirectInputEffect methods ***/
  258.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  259.     STDMETHOD(GetEffectGuid)(THIS_ LPGUID) PURE;
  260.     STDMETHOD(GetParameters)(THIS_ LPDIEFFECT,DWORD) PURE;
  261.     STDMETHOD(SetParameters)(THIS_ LPCDIEFFECT,DWORD) PURE;
  262.     STDMETHOD(Start)(THIS_ DWORD,DWORD) PURE;
  263.     STDMETHOD(Stop)(THIS) PURE;
  264.     STDMETHOD(GetEffectStatus)(THIS_ LPDWORD) PURE;
  265.     STDMETHOD(Download)(THIS) PURE;
  266.     STDMETHOD(Unload)(THIS) PURE;
  267.     STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE;
  268. };
  269.  
  270. typedef struct IDirectInputEffect *LPDIRECTINPUTEFFECT;
  271.  
  272. #if !defined(__cplusplus) || defined(CINTERFACE)
  273. #define IDirectInputEffect_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  274. #define IDirectInputEffect_AddRef(p) (p)->lpVtbl->AddRef(p)
  275. #define IDirectInputEffect_Release(p) (p)->lpVtbl->Release(p)
  276. #define IDirectInputEffect_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
  277. #define IDirectInputEffect_GetEffectGuid(p,a) (p)->lpVtbl->GetEffectGuid(p,a)
  278. #define IDirectInputEffect_GetParameters(p,a,b) (p)->lpVtbl->GetParameters(p,a,b)
  279. #define IDirectInputEffect_SetParameters(p,a,b) (p)->lpVtbl->SetParameters(p,a,b)
  280. #define IDirectInputEffect_Start(p,a,b) (p)->lpVtbl->Start(p,a,b)
  281. #define IDirectInputEffect_Stop(p) (p)->lpVtbl->Stop(p)
  282. #define IDirectInputEffect_GetEffectStatus(p,a) (p)->lpVtbl->GetEffectStatus(p,a)
  283. #define IDirectInputEffect_Download(p) (p)->lpVtbl->Download(p)
  284. #define IDirectInputEffect_Unload(p) (p)->lpVtbl->Unload(p)
  285. #define IDirectInputEffect_Escape(p,a) (p)->lpVtbl->Escape(p,a)
  286. #else
  287. #define IDirectInputEffect_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
  288. #define IDirectInputEffect_AddRef(p) (p)->AddRef()
  289. #define IDirectInputEffect_Release(p) (p)->Release()
  290. #define IDirectInputEffect_Initialize(p,a,b,c) (p)->Initialize(a,b,c)
  291. #define IDirectInputEffect_GetEffectGuid(p,a) (p)->GetEffectGuid(a)
  292. #define IDirectInputEffect_GetParameters(p,a,b) (p)->GetParameters(a,b)
  293. #define IDirectInputEffect_SetParameters(p,a,b) (p)->SetParameters(a,b)
  294. #define IDirectInputEffect_Start(p,a,b) (p)->Start(a,b)
  295. #define IDirectInputEffect_Stop(p) (p)->Stop()
  296. #define IDirectInputEffect_GetEffectStatus(p,a) (p)->GetEffectStatus(a)
  297. #define IDirectInputEffect_Download(p) (p)->Download()
  298. #define IDirectInputEffect_Unload(p) (p)->Unload()
  299. #define IDirectInputEffect_Escape(p,a) (p)->Escape(a)
  300. #endif
  301.  
  302. #endif /* DIJ_RINGZERO */
  303.  
  304. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  305.  
  306. /****************************************************************************
  307.  *
  308.  *      IDirectInputDevice
  309.  *
  310.  ****************************************************************************/
  311.  
  312. #define DIDEVTYPE_DEVICE    1
  313. #define DIDEVTYPE_MOUSE     2
  314. #define DIDEVTYPE_KEYBOARD  3
  315. #define DIDEVTYPE_JOYSTICK  4
  316. #define DIDEVTYPE_HID       0x00010000
  317.  
  318. #define DIDEVTYPEMOUSE_UNKNOWN          1
  319. #define DIDEVTYPEMOUSE_TRADITIONAL      2
  320. #define DIDEVTYPEMOUSE_FINGERSTICK      3
  321. #define DIDEVTYPEMOUSE_TOUCHPAD         4
  322. #define DIDEVTYPEMOUSE_TRACKBALL        5
  323.  
  324. #define DIDEVTYPEKEYBOARD_UNKNOWN       0
  325. #define DIDEVTYPEKEYBOARD_PCXT          1
  326. #define DIDEVTYPEKEYBOARD_OLIVETTI      2
  327. #define DIDEVTYPEKEYBOARD_PCAT          3
  328. #define DIDEVTYPEKEYBOARD_PCENH         4
  329. #define DIDEVTYPEKEYBOARD_NOKIA1050     5
  330. #define DIDEVTYPEKEYBOARD_NOKIA9140     6
  331. #define DIDEVTYPEKEYBOARD_NEC98         7
  332. #define DIDEVTYPEKEYBOARD_NEC98LAPTOP   8
  333. #define DIDEVTYPEKEYBOARD_NEC98106      9
  334. #define DIDEVTYPEKEYBOARD_JAPAN106     10
  335. #define DIDEVTYPEKEYBOARD_JAPANAX      11
  336. #define DIDEVTYPEKEYBOARD_J3100        12
  337.  
  338. #define DIDEVTYPEJOYSTICK_UNKNOWN       1
  339. #define DIDEVTYPEJOYSTICK_TRADITIONAL   2
  340. #define DIDEVTYPEJOYSTICK_FLIGHTSTICK   3
  341. #define DIDEVTYPEJOYSTICK_GAMEPAD       4
  342. #define DIDEVTYPEJOYSTICK_RUDDER        5
  343. #define DIDEVTYPEJOYSTICK_WHEEL         6
  344. #define DIDEVTYPEJOYSTICK_HEADTRACKER   7
  345.  
  346. #define GET_DIDEVICE_TYPE(dwDevType)    LOBYTE(dwDevType)
  347. #define GET_DIDEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType)
  348. #if(DIRECTINPUT_VERSION >= 0x0500)
  349. /* This structure is defined for DirectX 3.0 compatibility */
  350.  
  351. typedef struct DIDEVCAPS_DX3 {
  352.     DWORD   dwSize;
  353.     DWORD   dwFlags;
  354.     DWORD   dwDevType;
  355.     DWORD   dwAxes;
  356.     DWORD   dwButtons;
  357.     DWORD   dwPOVs;
  358. } DIDEVCAPS_DX3, *LPDIDEVCAPS_DX3;
  359. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  360.  
  361. typedef struct DIDEVCAPS {
  362.     DWORD   dwSize;
  363.     DWORD   dwFlags;
  364.     DWORD   dwDevType;
  365.     DWORD   dwAxes;
  366.     DWORD   dwButtons;
  367.     DWORD   dwPOVs;
  368. #if(DIRECTINPUT_VERSION >= 0x0500)
  369.     DWORD   dwFFSamplePeriod;
  370.     DWORD   dwFFMinTimeResolution;
  371.     DWORD   dwFirmwareRevision;
  372.     DWORD   dwHardwareRevision;
  373.     DWORD   dwFFDriverVersion;
  374. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  375. } DIDEVCAPS, *LPDIDEVCAPS;
  376.  
  377. #define DIDC_ATTACHED           0x00000001
  378. #define DIDC_POLLEDDEVICE       0x00000002
  379. #define DIDC_EMULATED           0x00000004
  380. #define DIDC_POLLEDDATAFORMAT   0x00000008
  381. #if(DIRECTINPUT_VERSION >= 0x0500)
  382. #define DIDC_FORCEFEEDBACK      0x00000100
  383. #define DIDC_FFATTACK           0x00000200
  384. #define DIDC_FFFADE             0x00000400
  385. #define DIDC_SATURATION         0x00000800
  386. #define DIDC_POSNEGCOEFFICIENTS 0x00001000
  387. #define DIDC_POSNEGSATURATION   0x00002000
  388. #define DIDC_DEADBAND           0x00004000
  389. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  390.  
  391. #define DIDFT_ALL           0x00000000
  392.  
  393. #define DIDFT_RELAXIS       0x00000001
  394. #define DIDFT_ABSAXIS       0x00000002
  395. #define DIDFT_AXIS          0x00000003
  396.  
  397. #define DIDFT_PSHBUTTON     0x00000004
  398. #define DIDFT_TGLBUTTON     0x00000008
  399. #define DIDFT_BUTTON        0x0000000C
  400.  
  401. #define DIDFT_POV           0x00000010
  402.  
  403. #define DIDFT_COLLECTION    0x00000040
  404. #define DIDFT_NODATA        0x00000080
  405. #define DIDFT_ANYINSTANCE   0x00FFFF00
  406. #define DIDFT_INSTANCEMASK  DIDFT_ANYINSTANCE
  407. #define DIDFT_MAKEINSTANCE(n) ((WORD)(n) << 8)
  408. #define DIDFT_GETTYPE(n)     LOBYTE(n)
  409. #define DIDFT_GETINSTANCE(n) LOWORD((n) >> 8)
  410. #define DIDFT_FFACTUATOR        0x01000000
  411. #define DIDFT_FFEFFECTTRIGGER   0x02000000
  412. #define DIDFT_OUTPUT            0x10000000
  413. #define DIDFT_ENUMCOLLECTION(n) ((WORD)(n) << 8)
  414. #define DIDFT_NOCOLLECTION      0x00FFFF00
  415.  
  416. #ifndef DIJ_RINGZERO
  417.  
  418. typedef struct _DIOBJECTDATAFORMAT {
  419.     const GUID *pguid;
  420.     DWORD   dwOfs;
  421.     DWORD   dwType;
  422.     DWORD   dwFlags;
  423. } DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT;
  424. typedef const DIOBJECTDATAFORMAT *LPCDIOBJECTDATAFORMAT;
  425.  
  426. typedef struct _DIDATAFORMAT {
  427.     DWORD   dwSize;
  428.     DWORD   dwObjSize;
  429.     DWORD   dwFlags;
  430.     DWORD   dwDataSize;
  431.     DWORD   dwNumObjs;
  432.     LPDIOBJECTDATAFORMAT rgodf;
  433. } DIDATAFORMAT, *LPDIDATAFORMAT;
  434. typedef const DIDATAFORMAT *LPCDIDATAFORMAT;
  435.  
  436. #define DIDF_ABSAXIS            0x00000001
  437. #define DIDF_RELAXIS            0x00000002
  438.  
  439. extern const DIDATAFORMAT c_dfDIMouse;
  440. extern const DIDATAFORMAT c_dfDIKeyboard;
  441. extern const DIDATAFORMAT c_dfDIJoystick;
  442. extern const DIDATAFORMAT c_dfDIJoystick2;
  443. #if(DIRECTINPUT_VERSION >= 0x0500)
  444. /* These structures are defined for DirectX 3.0 compatibility */
  445.  
  446. typedef struct DIDEVICEOBJECTINSTANCE_DX3A {
  447.     DWORD   dwSize;
  448.     GUID    guidType;
  449.     DWORD   dwOfs;
  450.     DWORD   dwType;
  451.     DWORD   dwFlags;
  452.     CHAR    tszName[MAX_PATH];
  453. } DIDEVICEOBJECTINSTANCE_DX3A, *LPDIDEVICEOBJECTINSTANCE_DX3A;
  454. typedef struct DIDEVICEOBJECTINSTANCE_DX3W {
  455.     DWORD   dwSize;
  456.     GUID    guidType;
  457.     DWORD   dwOfs;
  458.     DWORD   dwType;
  459.     DWORD   dwFlags;
  460.     WCHAR   tszName[MAX_PATH];
  461. } DIDEVICEOBJECTINSTANCE_DX3W, *LPDIDEVICEOBJECTINSTANCE_DX3W;
  462. #ifdef UNICODE
  463. typedef DIDEVICEOBJECTINSTANCE_DX3W DIDEVICEOBJECTINSTANCE_DX3;
  464. typedef LPDIDEVICEOBJECTINSTANCE_DX3W LPDIDEVICEOBJECTINSTANCE_DX3;
  465. #else
  466. typedef DIDEVICEOBJECTINSTANCE_DX3A DIDEVICEOBJECTINSTANCE_DX3;
  467. typedef LPDIDEVICEOBJECTINSTANCE_DX3A LPDIDEVICEOBJECTINSTANCE_DX3;
  468. #endif // UNICODE
  469. typedef const DIDEVICEOBJECTINSTANCE_DX3A *LPCDIDEVICEOBJECTINSTANCE_DX3A;
  470. typedef const DIDEVICEOBJECTINSTANCE_DX3W *LPCDIDEVICEOBJECTINSTANCE_DX3W;
  471. typedef const DIDEVICEOBJECTINSTANCE_DX3  *LPCDIDEVICEOBJECTINSTANCE_DX3;
  472. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  473.  
  474. typedef struct DIDEVICEOBJECTINSTANCEA {
  475.     DWORD   dwSize;
  476.     GUID    guidType;
  477.     DWORD   dwOfs;
  478.     DWORD   dwType;
  479.     DWORD   dwFlags;
  480.     CHAR    tszName[MAX_PATH];
  481. #if(DIRECTINPUT_VERSION >= 0x0500)
  482.     DWORD   dwFFMaxForce;
  483.     DWORD   dwFFForceResolution;
  484.     WORD    wCollectionNumber;
  485.     WORD    wDesignatorIndex;
  486.     WORD    wUsagePage;
  487.     WORD    wUsage;
  488.     DWORD   dwDimension;
  489.     WORD    wExponent;
  490.     WORD    wReserved;
  491. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  492. } DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA;
  493. typedef struct DIDEVICEOBJECTINSTANCEW {
  494.     DWORD   dwSize;
  495.     GUID    guidType;
  496.     DWORD   dwOfs;
  497.     DWORD   dwType;
  498.     DWORD   dwFlags;
  499.     WCHAR   tszName[MAX_PATH];
  500. #if(DIRECTINPUT_VERSION >= 0x0500)
  501.     DWORD   dwFFMaxForce;
  502.     DWORD   dwFFForceResolution;
  503.     WORD    wCollectionNumber;
  504.     WORD    wDesignatorIndex;
  505.     WORD    wUsagePage;
  506.     WORD    wUsage;
  507.     DWORD   dwDimension;
  508.     WORD    wExponent;
  509.     WORD    wReserved;
  510. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  511. } DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW;
  512. #ifdef UNICODE
  513. typedef DIDEVICEOBJECTINSTANCEW DIDEVICEOBJECTINSTANCE;
  514. typedef LPDIDEVICEOBJECTINSTANCEW LPDIDEVICEOBJECTINSTANCE;
  515. #else
  516. typedef DIDEVICEOBJECTINSTANCEA DIDEVICEOBJECTINSTANCE;
  517. typedef LPDIDEVICEOBJECTINSTANCEA LPDIDEVICEOBJECTINSTANCE;
  518. #endif // UNICODE
  519. typedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA;
  520. typedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW;
  521. typedef const DIDEVICEOBJECTINSTANCE  *LPCDIDEVICEOBJECTINSTANCE;
  522.  
  523. typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA, LPVOID);
  524. typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW, LPVOID);
  525. #ifdef UNICODE
  526. #define LPDIENUMDEVICEOBJECTSCALLBACK  LPDIENUMDEVICEOBJECTSCALLBACKW
  527. #else
  528. #define LPDIENUMDEVICEOBJECTSCALLBACK  LPDIENUMDEVICEOBJECTSCALLBACKA
  529. #endif // !UNICODE
  530.  
  531. #if(DIRECTINPUT_VERSION >= 0x0500)
  532. #define DIDOI_FFACTUATOR        0x00000001
  533. #define DIDOI_FFEFFECTTRIGGER   0x00000002
  534. #define DIDOI_POLLED            0x00008000
  535. #define DIDOI_ASPECTPOSITION    0x00000100
  536. #define DIDOI_ASPECTVELOCITY    0x00000200
  537. #define DIDOI_ASPECTACCEL       0x00000300
  538. #define DIDOI_ASPECTFORCE       0x00000400
  539. #define DIDOI_ASPECTMASK        0x00000F00
  540. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  541.  
  542. typedef struct DIPROPHEADER {
  543.     DWORD   dwSize;
  544.     DWORD   dwHeaderSize;
  545.     DWORD   dwObj;
  546.     DWORD   dwHow;
  547. } DIPROPHEADER, *LPDIPROPHEADER;
  548. typedef const DIPROPHEADER *LPCDIPROPHEADER;
  549.  
  550. #define DIPH_DEVICE             0
  551. #define DIPH_BYOFFSET           1
  552. #define DIPH_BYID               2
  553. #define DIPH_BYUSAGE            3
  554.  
  555. #define DIMAKEUSAGEDWORD(UsagePage, Usage) \
  556.                                 (DWORD)MAKELONG(Usage, UsagePage)
  557.  
  558. typedef struct DIPROPDWORD {
  559.     DIPROPHEADER diph;
  560.     DWORD   dwData;
  561. } DIPROPDWORD, *LPDIPROPDWORD;
  562. typedef const DIPROPDWORD *LPCDIPROPDWORD;
  563.  
  564. typedef struct DIPROPRANGE {
  565.     DIPROPHEADER diph;
  566.     LONG    lMin;
  567.     LONG    lMax;
  568. } DIPROPRANGE, *LPDIPROPRANGE;
  569. typedef const DIPROPRANGE *LPCDIPROPRANGE;
  570.  
  571. #define DIPROPRANGE_NOMIN       ((LONG)0x80000000)
  572. #define DIPROPRANGE_NOMAX       ((LONG)0x7FFFFFFF)
  573.  
  574. typedef struct DIPROPCAL {
  575.     DIPROPHEADER diph;
  576.     LONG    lMin;
  577.     LONG    lCenter;
  578.     LONG    lMax;
  579. } DIPROPCAL, *LPDIPROPCAL;
  580. typedef const DIPROPCAL *LPCDIPROPCAL;
  581.  
  582. typedef struct DIPROPGUIDANDPATH {
  583.     DIPROPHEADER diph;
  584.     GUID    guidClass;
  585.     WCHAR   wszPath[MAX_PATH];
  586. } DIPROPGUIDANDPATH, *LPDIPROPGUIDANDPATH;
  587. typedef const DIPROPGUIDANDPATH *LPCDIPROPGUIDANDPATH;
  588.  
  589. #ifdef __cplusplus
  590. #define MAKEDIPROP(prop)    (*(const GUID *)(prop))
  591. #else
  592. #define MAKEDIPROP(prop)    ((REFGUID)(prop))
  593. #endif
  594.  
  595. #define DIPROP_BUFFERSIZE       MAKEDIPROP(1)
  596.  
  597. #define DIPROP_AXISMODE         MAKEDIPROP(2)
  598.  
  599. #define DIPROPAXISMODE_ABS      0
  600. #define DIPROPAXISMODE_REL      1
  601.  
  602. #define DIPROP_GRANULARITY      MAKEDIPROP(3)
  603.  
  604. #define DIPROP_RANGE            MAKEDIPROP(4)
  605.  
  606. #define DIPROP_DEADZONE         MAKEDIPROP(5)
  607.  
  608. #define DIPROP_SATURATION       MAKEDIPROP(6)
  609.  
  610. #define DIPROP_FFGAIN           MAKEDIPROP(7)
  611.  
  612. #define DIPROP_FFLOAD           MAKEDIPROP(8)
  613.  
  614. #define DIPROP_AUTOCENTER       MAKEDIPROP(9)
  615.  
  616. #define DIPROPAUTOCENTER_OFF    0
  617. #define DIPROPAUTOCENTER_ON     1
  618.  
  619. #define DIPROP_CALIBRATIONMODE  MAKEDIPROP(10)
  620.  
  621. #define DIPROPCALIBRATIONMODE_COOKED    0
  622. #define DIPROPCALIBRATIONMODE_RAW       1
  623. #define DIPROP_CALIBRATION      MAKEDIPROP(11)
  624.  
  625. #define DIPROP_GUIDANDPATH      MAKEDIPROP(12)
  626.  
  627. typedef struct DIDEVICEOBJECTDATA {
  628.     DWORD   dwOfs;
  629.     DWORD   dwData;
  630.     DWORD   dwTimeStamp;
  631.     DWORD   dwSequence;
  632. } DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA;
  633. typedef const DIDEVICEOBJECTDATA *LPCDIDEVICEOBJECTDATA;
  634.  
  635. #define DIGDD_PEEK          0x00000001
  636.  
  637. #define DISEQUENCE_COMPARE(dwSequence1, cmp, dwSequence2) \
  638.                         ((int)((dwSequence1) - (dwSequence2)) cmp 0)
  639. #define DISCL_EXCLUSIVE     0x00000001
  640. #define DISCL_NONEXCLUSIVE  0x00000002
  641. #define DISCL_FOREGROUND    0x00000004
  642. #define DISCL_BACKGROUND    0x00000008
  643. #if(DIRECTINPUT_VERSION >= 0x0500)
  644. /* These structures are defined for DirectX 3.0 compatibility */
  645.  
  646. typedef struct DIDEVICEINSTANCE_DX3A {
  647.     DWORD   dwSize;
  648.     GUID    guidInstance;
  649.     GUID    guidProduct;
  650.     DWORD   dwDevType;
  651.     CHAR    tszInstanceName[MAX_PATH];
  652.     CHAR    tszProductName[MAX_PATH];
  653. } DIDEVICEINSTANCE_DX3A, *LPDIDEVICEINSTANCE_DX3A;
  654. typedef struct DIDEVICEINSTANCE_DX3W {
  655.     DWORD   dwSize;
  656.     GUID    guidInstance;
  657.     GUID    guidProduct;
  658.     DWORD   dwDevType;
  659.     WCHAR   tszInstanceName[MAX_PATH];
  660.     WCHAR   tszProductName[MAX_PATH];
  661. } DIDEVICEINSTANCE_DX3W, *LPDIDEVICEINSTANCE_DX3W;
  662. #ifdef UNICODE
  663. typedef DIDEVICEINSTANCE_DX3W DIDEVICEINSTANCE_DX3;
  664. typedef LPDIDEVICEINSTANCE_DX3W LPDIDEVICEINSTANCE_DX3;
  665. #else
  666. typedef DIDEVICEINSTANCE_DX3A DIDEVICEINSTANCE_DX3;
  667. typedef LPDIDEVICEINSTANCE_DX3A LPDIDEVICEINSTANCE_DX3;
  668. #endif // UNICODE
  669. typedef const DIDEVICEINSTANCE_DX3A *LPCDIDEVICEINSTANCE_DX3A;
  670. typedef const DIDEVICEINSTANCE_DX3W *LPCDIDEVICEINSTANCE_DX3W;
  671. typedef const DIDEVICEINSTANCE_DX3  *LPCDIDEVICEINSTANCE_DX3;
  672. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  673.  
  674. typedef struct DIDEVICEINSTANCEA {
  675.     DWORD   dwSize;
  676.     GUID    guidInstance;
  677.     GUID    guidProduct;
  678.     DWORD   dwDevType;
  679.     CHAR    tszInstanceName[MAX_PATH];
  680.     CHAR    tszProductName[MAX_PATH];
  681. #if(DIRECTINPUT_VERSION >= 0x0500)
  682.     GUID    guidFFDriver;
  683.     WORD    wUsagePage;
  684.     WORD    wUsage;
  685. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  686. } DIDEVICEINSTANCEA, *LPDIDEVICEINSTANCEA;
  687. typedef struct DIDEVICEINSTANCEW {
  688.     DWORD   dwSize;
  689.     GUID    guidInstance;
  690.     GUID    guidProduct;
  691.     DWORD   dwDevType;
  692.     WCHAR   tszInstanceName[MAX_PATH];
  693.     WCHAR   tszProductName[MAX_PATH];
  694. #if(DIRECTINPUT_VERSION >= 0x0500)
  695.     GUID    guidFFDriver;
  696.     WORD    wUsagePage;
  697.     WORD    wUsage;
  698. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  699. } DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW;
  700. #ifdef UNICODE
  701. typedef DIDEVICEINSTANCEW DIDEVICEINSTANCE;
  702. typedef LPDIDEVICEINSTANCEW LPDIDEVICEINSTANCE;
  703. #else
  704. typedef DIDEVICEINSTANCEA DIDEVICEINSTANCE;
  705. typedef LPDIDEVICEINSTANCEA LPDIDEVICEINSTANCE;
  706. #endif // UNICODE
  707. typedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA;
  708. typedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW;
  709. typedef const DIDEVICEINSTANCE  *LPCDIDEVICEINSTANCE;
  710.  
  711. #undef INTERFACE
  712. #define INTERFACE IDirectInputDeviceW
  713.  
  714. DECLARE_INTERFACE_(IDirectInputDeviceW, IUnknown)
  715. {
  716.     /*** IUnknown methods ***/
  717.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  718.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  719.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  720.  
  721.     /*** IDirectInputDeviceW methods ***/
  722.     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
  723.     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE;
  724.     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
  725.     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
  726.     STDMETHOD(Acquire)(THIS) PURE;
  727.     STDMETHOD(Unacquire)(THIS) PURE;
  728.     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
  729.     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  730.     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
  731.     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
  732.     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
  733.     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE;
  734.     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE;
  735.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  736.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  737. };
  738.  
  739. typedef struct IDirectInputDeviceW *LPDIRECTINPUTDEVICEW;
  740.  
  741. #undef INTERFACE
  742. #define INTERFACE IDirectInputDeviceA
  743.  
  744. DECLARE_INTERFACE_(IDirectInputDeviceA, IUnknown)
  745. {
  746.     /*** IUnknown methods ***/
  747.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  748.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  749.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  750.  
  751.     /*** IDirectInputDeviceA methods ***/
  752.     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
  753.     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE;
  754.     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
  755.     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
  756.     STDMETHOD(Acquire)(THIS) PURE;
  757.     STDMETHOD(Unacquire)(THIS) PURE;
  758.     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
  759.     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  760.     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
  761.     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
  762.     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
  763.     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE;
  764.     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE;
  765.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  766.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  767. };
  768.  
  769. typedef struct IDirectInputDeviceA *LPDIRECTINPUTDEVICEA;
  770.  
  771. #ifdef UNICODE
  772. #define IID_IDirectInputDevice IID_IDirectInputDeviceW
  773. #define IDirectInputDevice IDirectInputDeviceW
  774. #define IDirectInputDeviceVtbl IDirectInputDeviceWVtbl
  775. #else
  776. #define IID_IDirectInputDevice IID_IDirectInputDeviceA
  777. #define IDirectInputDevice IDirectInputDeviceA
  778. #define IDirectInputDeviceVtbl IDirectInputDeviceAVtbl
  779. #endif
  780. typedef struct IDirectInputDevice *LPDIRECTINPUTDEVICE;
  781.  
  782. #if !defined(__cplusplus) || defined(CINTERFACE)
  783. #define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  784. #define IDirectInputDevice_AddRef(p) (p)->lpVtbl->AddRef(p)
  785. #define IDirectInputDevice_Release(p) (p)->lpVtbl->Release(p)
  786. #define IDirectInputDevice_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a)
  787. #define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c)
  788. #define IDirectInputDevice_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b)
  789. #define IDirectInputDevice_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b)
  790. #define IDirectInputDevice_Acquire(p) (p)->lpVtbl->Acquire(p)
  791. #define IDirectInputDevice_Unacquire(p) (p)->lpVtbl->Unacquire(p)
  792. #define IDirectInputDevice_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b)
  793. #define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d)
  794. #define IDirectInputDevice_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a)
  795. #define IDirectInputDevice_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a)
  796. #define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)
  797. #define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c)
  798. #define IDirectInputDevice_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a)
  799. #define IDirectInputDevice_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
  800. #define IDirectInputDevice_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
  801. #else
  802. #define IDirectInputDevice_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
  803. #define IDirectInputDevice_AddRef(p) (p)->AddRef()
  804. #define IDirectInputDevice_Release(p) (p)->Release()
  805. #define IDirectInputDevice_GetCapabilities(p,a) (p)->GetCapabilities(a)
  806. #define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c)
  807. #define IDirectInputDevice_GetProperty(p,a,b) (p)->GetProperty(a,b)
  808. #define IDirectInputDevice_SetProperty(p,a,b) (p)->SetProperty(a,b)
  809. #define IDirectInputDevice_Acquire(p) (p)->Acquire()
  810. #define IDirectInputDevice_Unacquire(p) (p)->Unacquire()
  811. #define IDirectInputDevice_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b)
  812. #define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d)
  813. #define IDirectInputDevice_SetDataFormat(p,a) (p)->SetDataFormat(a)
  814. #define IDirectInputDevice_SetEventNotification(p,a) (p)->SetEventNotification(a)
  815. #define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b)
  816. #define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c)
  817. #define IDirectInputDevice_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a)
  818. #define IDirectInputDevice_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b)
  819. #define IDirectInputDevice_Initialize(p,a,b,c) (p)->Initialize(a,b,c)
  820. #endif
  821.  
  822. #endif /* DIJ_RINGZERO */
  823.  
  824.  
  825. #if(DIRECTINPUT_VERSION >= 0x0500)
  826. #define DISFFC_RESET            0x00000001
  827. #define DISFFC_STOPALL          0x00000002
  828. #define DISFFC_PAUSE            0x00000004
  829. #define DISFFC_CONTINUE         0x00000008
  830. #define DISFFC_SETACTUATORSON   0x00000010
  831. #define DISFFC_SETACTUATORSOFF  0x00000020
  832.  
  833. #define DIGFFS_EMPTY            0x00000001
  834. #define DIGFFS_STOPPED          0x00000002
  835. #define DIGFFS_PAUSED           0x00000004
  836. #define DIGFFS_ACTUATORSON      0x00000010
  837. #define DIGFFS_ACTUATORSOFF     0x00000020
  838. #define DIGFFS_POWERON          0x00000040
  839. #define DIGFFS_POWEROFF         0x00000080
  840. #define DIGFFS_SAFETYSWITCHON   0x00000100
  841. #define DIGFFS_SAFETYSWITCHOFF  0x00000200
  842. #define DIGFFS_USERFFSWITCHON   0x00000400
  843. #define DIGFFS_USERFFSWITCHOFF  0x00000800
  844. #define DIGFFS_DEVICELOST       0x80000000
  845.  
  846. #ifndef DIJ_RINGZERO
  847.  
  848. typedef struct DIEFFECTINFOA {
  849.     DWORD   dwSize;
  850.     GUID    guid;
  851.     DWORD   dwEffType;
  852.     DWORD   dwStaticParams;
  853.     DWORD   dwDynamicParams;
  854.     CHAR    tszName[MAX_PATH];
  855. } DIEFFECTINFOA, *LPDIEFFECTINFOA;
  856. typedef struct DIEFFECTINFOW {
  857.     DWORD   dwSize;
  858.     GUID    guid;
  859.     DWORD   dwEffType;
  860.     DWORD   dwStaticParams;
  861.     DWORD   dwDynamicParams;
  862.     WCHAR   tszName[MAX_PATH];
  863. } DIEFFECTINFOW, *LPDIEFFECTINFOW;
  864. #ifdef UNICODE
  865. typedef DIEFFECTINFOW DIEFFECTINFO;
  866. typedef LPDIEFFECTINFOW LPDIEFFECTINFO;
  867. #else
  868. typedef DIEFFECTINFOA DIEFFECTINFO;
  869. typedef LPDIEFFECTINFOA LPDIEFFECTINFO;
  870. #endif // UNICODE
  871. typedef const DIEFFECTINFOA *LPCDIEFFECTINFOA;
  872. typedef const DIEFFECTINFOW *LPCDIEFFECTINFOW;
  873. typedef const DIEFFECTINFO  *LPCDIEFFECTINFO;
  874.  
  875. #define DISDD_CONTINUE          0x00000001
  876.  
  877. typedef BOOL (FAR PASCAL * LPDIENUMEFFECTSCALLBACKA)(LPCDIEFFECTINFOA, LPVOID);
  878. typedef BOOL (FAR PASCAL * LPDIENUMEFFECTSCALLBACKW)(LPCDIEFFECTINFOW, LPVOID);
  879. #ifdef UNICODE
  880. #define LPDIENUMEFFECTSCALLBACK  LPDIENUMEFFECTSCALLBACKW
  881. #else
  882. #define LPDIENUMEFFECTSCALLBACK  LPDIENUMEFFECTSCALLBACKA
  883. #endif // !UNICODE
  884. typedef BOOL (FAR PASCAL * LPDIENUMCREATEDEFFECTOBJECTSCALLBACK)(LPDIRECTINPUTEFFECT, LPVOID);
  885.  
  886. #undef INTERFACE
  887. #define INTERFACE IDirectInputDevice2W
  888.  
  889. DECLARE_INTERFACE_(IDirectInputDevice2W, IDirectInputDeviceW)
  890. {
  891.     /*** IUnknown methods ***/
  892.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  893.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  894.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  895.  
  896.     /*** IDirectInputDeviceW methods ***/
  897.     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
  898.     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE;
  899.     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
  900.     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
  901.     STDMETHOD(Acquire)(THIS) PURE;
  902.     STDMETHOD(Unacquire)(THIS) PURE;
  903.     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
  904.     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  905.     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
  906.     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
  907.     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
  908.     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE;
  909.     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE;
  910.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  911.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  912.  
  913.     /*** IDirectInputDevice2W methods ***/
  914.     STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE;
  915.     STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKW,LPVOID,DWORD) PURE;
  916.     STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOW,REFGUID) PURE;
  917.     STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE;
  918.     STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE;
  919.     STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE;
  920.     STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE;
  921.     STDMETHOD(Poll)(THIS) PURE;
  922.     STDMETHOD(SendDeviceData)(THIS_ DWORD,LPCDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  923. };
  924.  
  925. typedef struct IDirectInputDevice2W *LPDIRECTINPUTDEVICE2W;
  926.  
  927. #undef INTERFACE
  928. #define INTERFACE IDirectInputDevice2A
  929.  
  930. DECLARE_INTERFACE_(IDirectInputDevice2A, IDirectInputDeviceA)
  931. {
  932.     /*** IUnknown methods ***/
  933.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  934.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  935.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  936.  
  937.     /*** IDirectInputDeviceA methods ***/
  938.     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
  939.     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE;
  940.     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
  941.     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
  942.     STDMETHOD(Acquire)(THIS) PURE;
  943.     STDMETHOD(Unacquire)(THIS) PURE;
  944.     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
  945.     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  946.     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
  947.     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
  948.     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
  949.     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE;
  950.     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE;
  951.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  952.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
  953.  
  954.     /*** IDirectInputDevice2A methods ***/
  955.     STDMETHOD(CreateEffect)(THIS_ REFGUID,LPCDIEFFECT,LPDIRECTINPUTEFFECT *,LPUNKNOWN) PURE;
  956.     STDMETHOD(EnumEffects)(THIS_ LPDIENUMEFFECTSCALLBACKA,LPVOID,DWORD) PURE;
  957.     STDMETHOD(GetEffectInfo)(THIS_ LPDIEFFECTINFOA,REFGUID) PURE;
  958.     STDMETHOD(GetForceFeedbackState)(THIS_ LPDWORD) PURE;
  959.     STDMETHOD(SendForceFeedbackCommand)(THIS_ DWORD) PURE;
  960.     STDMETHOD(EnumCreatedEffectObjects)(THIS_ LPDIENUMCREATEDEFFECTOBJECTSCALLBACK,LPVOID,DWORD) PURE;
  961.     STDMETHOD(Escape)(THIS_ LPDIEFFESCAPE) PURE;
  962.     STDMETHOD(Poll)(THIS) PURE;
  963.     STDMETHOD(SendDeviceData)(THIS_ DWORD,LPCDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
  964. };
  965.  
  966. typedef struct IDirectInputDevice2A *LPDIRECTINPUTDEVICE2A;
  967.  
  968. #ifdef UNICODE
  969. #define IID_IDirectInputDevice2 IID_IDirectInputDevice2W
  970. #define IDirectInputDevice2 IDirectInputDevice2W
  971. #define IDirectInputDevice2Vtbl IDirectInputDevice2WVtbl
  972. #else
  973. #define IID_IDirectInputDevice2 IID_IDirectInputDevice2A
  974. #define IDirectInputDevice2 IDirectInputDevice2A
  975. #define IDirectInputDevice2Vtbl IDirectInputDevice2AVtbl
  976. #endif
  977. typedef struct IDirectInputDevice2 *LPDIRECTINPUTDEVICE2;
  978.  
  979. #if !defined(__cplusplus) || defined(CINTERFACE)
  980. #define IDirectInputDevice2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  981. #define IDirectInputDevice2_AddRef(p) (p)->lpVtbl->AddRef(p)
  982. #define IDirectInputDevice2_Release(p) (p)->lpVtbl->Release(p)
  983. #define IDirectInputDevice2_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a)
  984. #define IDirectInputDevice2_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c)
  985. #define IDirectInputDevice2_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b)
  986. #define IDirectInputDevice2_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b)
  987. #define IDirectInputDevice2_Acquire(p) (p)->lpVtbl->Acquire(p)
  988. #define IDirectInputDevice2_Unacquire(p) (p)->lpVtbl->Unacquire(p)
  989. #define IDirectInputDevice2_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b)
  990. #define IDirectInputDevice2_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d)
  991. #define IDirectInputDevice2_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a)
  992. #define IDirectInputDevice2_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a)
  993. #define IDirectInputDevice2_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)
  994. #define IDirectInputDevice2_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c)
  995. #define IDirectInputDevice2_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a)
  996. #define IDirectInputDevice2_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
  997. #define IDirectInputDevice2_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
  998. #define IDirectInputDevice2_CreateEffect(p,a,b,c,d) (p)->lpVtbl->CreateEffect(p,a,b,c,d)
  999. #define IDirectInputDevice2_EnumEffects(p,a,b,c) (p)->lpVtbl->EnumEffects(p,a,b,c)
  1000. #define IDirectInputDevice2_GetEffectInfo(p,a,b) (p)->lpVtbl->GetEffectInfo(p,a,b)
  1001. #define IDirectInputDevice2_GetForceFeedbackState(p,a) (p)->lpVtbl->GetForceFeedbackState(p,a)
  1002. #define IDirectInputDevice2_SendForceFeedbackCommand(p,a) (p)->lpVtbl->SendForceFeedbackCommand(p,a)
  1003. #define IDirectInputDevice2_EnumCreatedEffectObjects(p,a,b,c) (p)->lpVtbl->EnumCreatedEffectObjects(p,a,b,c)
  1004. #define IDirectInputDevice2_Escape(p,a) (p)->lpVtbl->Escape(p,a)
  1005. #define IDirectInputDevice2_Poll(p) (p)->lpVtbl->Poll(p)
  1006. #define IDirectInputDevice2_SendDeviceData(p,a,b,c,d) (p)->lpVtbl->SendDeviceData(p,a,b,c,d)
  1007. #else
  1008. #define IDirectInputDevice2_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
  1009. #define IDirectInputDevice2_AddRef(p) (p)->AddRef()
  1010. #define IDirectInputDevice2_Release(p) (p)->Release()
  1011. #define IDirectInputDevice2_GetCapabilities(p,a) (p)->GetCapabilities(a)
  1012. #define IDirectInputDevice2_EnumObjects(p,a,b,c) (p)->EnumObjects(a,b,c)
  1013. #define IDirectInputDevice2_GetProperty(p,a,b) (p)->GetProperty(a,b)
  1014. #define IDirectInputDevice2_SetProperty(p,a,b) (p)->SetProperty(a,b)
  1015. #define IDirectInputDevice2_Acquire(p) (p)->Acquire()
  1016. #define IDirectInputDevice2_Unacquire(p) (p)->Unacquire()
  1017. #define IDirectInputDevice2_GetDeviceState(p,a,b) (p)->GetDeviceState(a,b)
  1018. #define IDirectInputDevice2_GetDeviceData(p,a,b,c,d) (p)->GetDeviceData(a,b,c,d)
  1019. #define IDirectInputDevice2_SetDataFormat(p,a) (p)->SetDataFormat(a)
  1020. #define IDirectInputDevice2_SetEventNotification(p,a) (p)->SetEventNotification(a)
  1021. #define IDirectInputDevice2_SetCooperativeLevel(p,a,b) (p)->SetCooperativeLevel(a,b)
  1022. #define IDirectInputDevice2_GetObjectInfo(p,a,b,c) (p)->GetObjectInfo(a,b,c)
  1023. #define IDirectInputDevice2_GetDeviceInfo(p,a) (p)->GetDeviceInfo(a)
  1024. #define IDirectInputDevice2_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b)
  1025. #define IDirectInputDevice2_Initialize(p,a,b,c) (p)->Initialize(a,b,c)
  1026. #define IDirectInputDevice2_CreateEffect(p,a,b,c,d) (p)->CreateEffect(a,b,c,d)
  1027. #define IDirectInputDevice2_EnumEffects(p,a,b,c) (p)->EnumEffects(a,b,c)
  1028. #define IDirectInputDevice2_GetEffectInfo(p,a,b) (p)->GetEffectInfo(a,b)
  1029. #define IDirectInputDevice2_GetForceFeedbackState(p,a) (p)->GetForceFeedbackState(a)
  1030. #define IDirectInputDevice2_SendForceFeedbackCommand(p,a) (p)->SendForceFeedbackCommand(a)
  1031. #define IDirectInputDevice2_EnumCreatedEffectObjects(p,a,b,c) (p)->EnumCreatedEffectObjects(a,b,c)
  1032. #define IDirectInputDevice2_Escape(p,a) (p)->Escape(a)
  1033. #define IDirectInputDevice2_Poll(p) (p)->Poll()
  1034. #define IDirectInputDevice2_SendDeviceData(p,a,b,c,d) (p)->SendDeviceData(a,b,c,d)
  1035. #endif
  1036.  
  1037. #endif /* DIJ_RINGZERO */
  1038.  
  1039. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  1040.  
  1041. /****************************************************************************
  1042.  *
  1043.  *      Mouse
  1044.  *
  1045.  ****************************************************************************/
  1046.  
  1047. #ifndef DIJ_RINGZERO
  1048.  
  1049. typedef struct _DIMOUSESTATE {
  1050.     LONG    lX;
  1051.     LONG    lY;
  1052.     LONG    lZ;
  1053.     BYTE    rgbButtons[4];
  1054. } DIMOUSESTATE, *LPDIMOUSESTATE;
  1055.  
  1056. #define DIMOFS_X        FIELD_OFFSET(DIMOUSESTATE, lX)
  1057. #define DIMOFS_Y        FIELD_OFFSET(DIMOUSESTATE, lY)
  1058. #define DIMOFS_Z        FIELD_OFFSET(DIMOUSESTATE, lZ)
  1059. #define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0)
  1060. #define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1)
  1061. #define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2)
  1062. #define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3)
  1063.  
  1064. #endif /* DIJ_RINGZERO */
  1065.  
  1066. /****************************************************************************
  1067.  *
  1068.  *      Keyboard
  1069.  *
  1070.  ****************************************************************************/
  1071.  
  1072. #ifndef DIJ_RINGZERO
  1073.  
  1074. /****************************************************************************
  1075.  *
  1076.  *      DirectInput keyboard scan codes
  1077.  *
  1078.  ****************************************************************************/
  1079.  
  1080. #define DIK_ESCAPE          0x01
  1081. #define DIK_1               0x02
  1082. #define DIK_2               0x03
  1083. #define DIK_3               0x04
  1084. #define DIK_4               0x05
  1085. #define DIK_5               0x06
  1086. #define DIK_6               0x07
  1087. #define DIK_7               0x08
  1088. #define DIK_8               0x09
  1089. #define DIK_9               0x0A
  1090. #define DIK_0               0x0B
  1091. #define DIK_MINUS           0x0C    /* - on main keyboard */
  1092. #define DIK_EQUALS          0x0D
  1093. #define DIK_BACK            0x0E    /* backspace */
  1094. #define DIK_TAB             0x0F
  1095. #define DIK_Q               0x10
  1096. #define DIK_W               0x11
  1097. #define DIK_E               0x12
  1098. #define DIK_R               0x13
  1099. #define DIK_T               0x14
  1100. #define DIK_Y               0x15
  1101. #define DIK_U               0x16
  1102. #define DIK_I               0x17
  1103. #define DIK_O               0x18
  1104. #define DIK_P               0x19
  1105. #define DIK_LBRACKET        0x1A
  1106. #define DIK_RBRACKET        0x1B
  1107. #define DIK_RETURN          0x1C    /* Enter on main keyboard */
  1108. #define DIK_LCONTROL        0x1D
  1109. #define DIK_A               0x1E
  1110. #define DIK_S               0x1F
  1111. #define DIK_D               0x20
  1112. #define DIK_F               0x21
  1113. #define DIK_G               0x22
  1114. #define DIK_H               0x23
  1115. #define DIK_J               0x24
  1116. #define DIK_K               0x25
  1117. #define DIK_L               0x26
  1118. #define DIK_SEMICOLON       0x27
  1119. #define DIK_APOSTROPHE      0x28
  1120. #define DIK_GRAVE           0x29    /* accent grave */
  1121. #define DIK_LSHIFT          0x2A
  1122. #define DIK_BACKSLASH       0x2B
  1123. #define DIK_Z               0x2C
  1124. #define DIK_X               0x2D
  1125. #define DIK_C               0x2E
  1126. #define DIK_V               0x2F
  1127. #define DIK_B               0x30
  1128. #define DIK_N               0x31
  1129. #define DIK_M               0x32
  1130. #define DIK_COMMA           0x33
  1131. #define DIK_PERIOD          0x34    /* . on main keyboard */
  1132. #define DIK_SLASH           0x35    /* / on main keyboard */
  1133. #define DIK_RSHIFT          0x36
  1134. #define DIK_MULTIPLY        0x37    /* * on numeric keypad */
  1135. #define DIK_LMENU           0x38    /* left Alt */
  1136. #define DIK_SPACE           0x39
  1137. #define DIK_CAPITAL         0x3A
  1138. #define DIK_F1              0x3B
  1139. #define DIK_F2              0x3C
  1140. #define DIK_F3              0x3D
  1141. #define DIK_F4              0x3E
  1142. #define DIK_F5              0x3F
  1143. #define DIK_F6              0x40
  1144. #define DIK_F7              0x41
  1145. #define DIK_F8              0x42
  1146. #define DIK_F9              0x43
  1147. #define DIK_F10             0x44
  1148. #define DIK_NUMLOCK         0x45
  1149. #define DIK_SCROLL          0x46    /* Scroll Lock */
  1150. #define DIK_NUMPAD7         0x47
  1151. #define DIK_NUMPAD8         0x48
  1152. #define DIK_NUMPAD9         0x49
  1153. #define DIK_SUBTRACT        0x4A    /* - on numeric keypad */
  1154. #define DIK_NUMPAD4         0x4B
  1155. #define DIK_NUMPAD5         0x4C
  1156. #define DIK_NUMPAD6         0x4D
  1157. #define DIK_ADD             0x4E    /* + on numeric keypad */
  1158. #define DIK_NUMPAD1         0x4F
  1159. #define DIK_NUMPAD2         0x50
  1160. #define DIK_NUMPAD3         0x51
  1161. #define DIK_NUMPAD0         0x52
  1162. #define DIK_DECIMAL         0x53    /* . on numeric keypad */
  1163. #define DIK_F11             0x57
  1164. #define DIK_F12             0x58
  1165.  
  1166. #define DIK_F13             0x64    /*                     (NEC PC98) */
  1167. #define DIK_F14             0x65    /*                     (NEC PC98) */
  1168. #define DIK_F15             0x66    /*                     (NEC PC98) */
  1169.  
  1170. #define DIK_KANA            0x70    /* (Japanese keyboard)            */
  1171. #define DIK_CONVERT         0x79    /* (Japanese keyboard)            */
  1172. #define DIK_NOCONVERT       0x7B    /* (Japanese keyboard)            */
  1173. #define DIK_YEN             0x7D    /* (Japanese keyboard)            */
  1174. #define DIK_NUMPADEQUALS    0x8D    /* = on numeric keypad (NEC PC98) */
  1175. #define DIK_CIRCUMFLEX      0x90    /* (Japanese keyboard)            */
  1176. #define DIK_AT              0x91    /*                     (NEC PC98) */
  1177. #define DIK_COLON           0x92    /*                     (NEC PC98) */
  1178. #define DIK_UNDERLINE       0x93    /*                     (NEC PC98) */
  1179. #define DIK_KANJI           0x94    /* (Japanese keyboard)            */
  1180. #define DIK_STOP            0x95    /*                     (NEC PC98) */
  1181. #define DIK_AX              0x96    /*                     (Japan AX) */
  1182. #define DIK_UNLABELED       0x97    /*                        (J3100) */
  1183. #define DIK_NUMPADENTER     0x9C    /* Enter on numeric keypad */
  1184. #define DIK_RCONTROL        0x9D
  1185. #define DIK_NUMPADCOMMA     0xB3    /* , on numeric keypad (NEC PC98) */
  1186. #define DIK_DIVIDE          0xB5    /* / on numeric keypad */
  1187. #define DIK_SYSRQ           0xB7
  1188. #define DIK_RMENU           0xB8    /* right Alt */
  1189. #define DIK_PAUSE           0xC5    /* Pause */
  1190. #define DIK_HOME            0xC7    /* Home on arrow keypad */
  1191. #define DIK_UP              0xC8    /* UpArrow on arrow keypad */
  1192. #define DIK_PRIOR           0xC9    /* PgUp on arrow keypad */
  1193. #define DIK_LEFT            0xCB    /* LeftArrow on arrow keypad */
  1194. #define DIK_RIGHT           0xCD    /* RightArrow on arrow keypad */
  1195. #define DIK_END             0xCF    /* End on arrow keypad */
  1196. #define DIK_DOWN            0xD0    /* DownArrow on arrow keypad */
  1197. #define DIK_NEXT            0xD1    /* PgDn on arrow keypad */
  1198. #define DIK_INSERT          0xD2    /* Insert on arrow keypad */
  1199. #define DIK_DELETE          0xD3    /* Delete on arrow keypad */
  1200. #define DIK_LWIN            0xDB    /* Left Windows key */
  1201. #define DIK_RWIN            0xDC    /* Right Windows key */
  1202. #define DIK_APPS            0xDD    /* AppMenu key */
  1203. #define DIK_POWER           0xDE
  1204. #define DIK_SLEEP           0xDF
  1205.  
  1206. /*
  1207.  *  Alternate names for keys, to facilitate transition from DOS.
  1208.  */
  1209. #define DIK_BACKSPACE       DIK_BACK            /* backspace */
  1210. #define DIK_NUMPADSTAR      DIK_MULTIPLY        /* * on numeric keypad */
  1211. #define DIK_LALT            DIK_LMENU           /* left Alt */
  1212. #define DIK_CAPSLOCK        DIK_CAPITAL         /* CapsLock */
  1213. #define DIK_NUMPADMINUS     DIK_SUBTRACT        /* - on numeric keypad */
  1214. #define DIK_NUMPADPLUS      DIK_ADD             /* + on numeric keypad */
  1215. #define DIK_NUMPADPERIOD    DIK_DECIMAL         /* . on numeric keypad */
  1216. #define DIK_NUMPADSLASH     DIK_DIVIDE          /* / on numeric keypad */
  1217. #define DIK_RALT            DIK_RMENU           /* right Alt */
  1218. #define DIK_UPARROW         DIK_UP              /* UpArrow on arrow keypad */
  1219. #define DIK_PGUP            DIK_PRIOR           /* PgUp on arrow keypad */
  1220. #define DIK_LEFTARROW       DIK_LEFT            /* LeftArrow on arrow keypad */
  1221. #define DIK_RIGHTARROW      DIK_RIGHT           /* RightArrow on arrow keypad */
  1222. #define DIK_DOWNARROW       DIK_DOWN            /* DownArrow on arrow keypad */
  1223. #define DIK_PGDN            DIK_NEXT            /* PgDn on arrow keypad */
  1224.  
  1225. #endif /* DIJ_RINGZERO */
  1226.  
  1227. /****************************************************************************
  1228.  *
  1229.  *      Joystick
  1230.  *
  1231.  ****************************************************************************/
  1232.  
  1233. #ifndef DIJ_RINGZERO
  1234.  
  1235. typedef struct DIJOYSTATE {
  1236.     LONG    lX;                     /* x-axis position              */
  1237.     LONG    lY;                     /* y-axis position              */
  1238.     LONG    lZ;                     /* z-axis position              */
  1239.     LONG    lRx;                    /* x-axis rotation              */
  1240.     LONG    lRy;                    /* y-axis rotation              */
  1241.     LONG    lRz;                    /* z-axis rotation              */
  1242.     LONG    rglSlider[2];           /* extra axes positions         */
  1243.     DWORD   rgdwPOV[4];             /* POV directions               */
  1244.     BYTE    rgbButtons[32];         /* 32 buttons                   */
  1245. } DIJOYSTATE, *LPDIJOYSTATE;
  1246.  
  1247. typedef struct DIJOYSTATE2 {
  1248.     LONG    lX;                     /* x-axis position              */
  1249.     LONG    lY;                     /* y-axis position              */
  1250.     LONG    lZ;                     /* z-axis position              */
  1251.     LONG    lRx;                    /* x-axis rotation              */
  1252.     LONG    lRy;                    /* y-axis rotation              */
  1253.     LONG    lRz;                    /* z-axis rotation              */
  1254.     LONG    rglSlider[2];           /* extra axes positions         */
  1255.     DWORD   rgdwPOV[4];             /* POV directions               */
  1256.     BYTE    rgbButtons[128];        /* 128 buttons                  */
  1257.     LONG    lVX;                    /* x-axis velocity              */
  1258.     LONG    lVY;                    /* y-axis velocity              */
  1259.     LONG    lVZ;                    /* z-axis velocity              */
  1260.     LONG    lVRx;                   /* x-axis angular velocity      */
  1261.     LONG    lVRy;                   /* y-axis angular velocity      */
  1262.     LONG    lVRz;                   /* z-axis angular velocity      */
  1263.     LONG    rglVSlider[2];          /* extra axes velocities        */
  1264.     LONG    lAX;                    /* x-axis acceleration          */
  1265.     LONG    lAY;                    /* y-axis acceleration          */
  1266.     LONG    lAZ;                    /* z-axis acceleration          */
  1267.     LONG    lARx;                   /* x-axis angular acceleration  */
  1268.     LONG    lARy;                   /* y-axis angular acceleration  */
  1269.     LONG    lARz;                   /* z-axis angular acceleration  */
  1270.     LONG    rglASlider[2];          /* extra axes accelerations     */
  1271.     LONG    lFX;                    /* x-axis force                 */
  1272.     LONG    lFY;                    /* y-axis force                 */
  1273.     LONG    lFZ;                    /* z-axis force                 */
  1274.     LONG    lFRx;                   /* x-axis torque                */
  1275.     LONG    lFRy;                   /* y-axis torque                */
  1276.     LONG    lFRz;                   /* z-axis torque                */
  1277.     LONG    rglFSlider[2];          /* extra axes forces            */
  1278. } DIJOYSTATE2, *LPDIJOYSTATE2;
  1279.  
  1280. #define DIJOFS_X            FIELD_OFFSET(DIJOYSTATE, lX)
  1281. #define DIJOFS_Y            FIELD_OFFSET(DIJOYSTATE, lY)
  1282. #define DIJOFS_Z            FIELD_OFFSET(DIJOYSTATE, lZ)
  1283. #define DIJOFS_RX           FIELD_OFFSET(DIJOYSTATE, lRx)
  1284. #define DIJOFS_RY           FIELD_OFFSET(DIJOYSTATE, lRy)
  1285. #define DIJOFS_RZ           FIELD_OFFSET(DIJOYSTATE, lRz)
  1286. #define DIJOFS_SLIDER(n)   (FIELD_OFFSET(DIJOYSTATE, rglSlider) + \
  1287.                                                         (n) * sizeof(LONG))
  1288. #define DIJOFS_POV(n)      (FIELD_OFFSET(DIJOYSTATE, rgdwPOV) + \
  1289.                                                         (n) * sizeof(DWORD))
  1290. #define DIJOFS_BUTTON(n)   (FIELD_OFFSET(DIJOYSTATE, rgbButtons) + (n))
  1291. #define DIJOFS_BUTTON0      DIJOFS_BUTTON(0)
  1292. #define DIJOFS_BUTTON1      DIJOFS_BUTTON(1)
  1293. #define DIJOFS_BUTTON2      DIJOFS_BUTTON(2)
  1294. #define DIJOFS_BUTTON3      DIJOFS_BUTTON(3)
  1295. #define DIJOFS_BUTTON4      DIJOFS_BUTTON(4)
  1296. #define DIJOFS_BUTTON5      DIJOFS_BUTTON(5)
  1297. #define DIJOFS_BUTTON6      DIJOFS_BUTTON(6)
  1298. #define DIJOFS_BUTTON7      DIJOFS_BUTTON(7)
  1299. #define DIJOFS_BUTTON8      DIJOFS_BUTTON(8)
  1300. #define DIJOFS_BUTTON9      DIJOFS_BUTTON(9)
  1301. #define DIJOFS_BUTTON10     DIJOFS_BUTTON(10)
  1302. #define DIJOFS_BUTTON11     DIJOFS_BUTTON(11)
  1303. #define DIJOFS_BUTTON12     DIJOFS_BUTTON(12)
  1304. #define DIJOFS_BUTTON13     DIJOFS_BUTTON(13)
  1305. #define DIJOFS_BUTTON14     DIJOFS_BUTTON(14)
  1306. #define DIJOFS_BUTTON15     DIJOFS_BUTTON(15)
  1307. #define DIJOFS_BUTTON16     DIJOFS_BUTTON(16)
  1308. #define DIJOFS_BUTTON17     DIJOFS_BUTTON(17)
  1309. #define DIJOFS_BUTTON18     DIJOFS_BUTTON(18)
  1310. #define DIJOFS_BUTTON19     DIJOFS_BUTTON(19)
  1311. #define DIJOFS_BUTTON20     DIJOFS_BUTTON(20)
  1312. #define DIJOFS_BUTTON21     DIJOFS_BUTTON(21)
  1313. #define DIJOFS_BUTTON22     DIJOFS_BUTTON(22)
  1314. #define DIJOFS_BUTTON23     DIJOFS_BUTTON(23)
  1315. #define DIJOFS_BUTTON24     DIJOFS_BUTTON(24)
  1316. #define DIJOFS_BUTTON25     DIJOFS_BUTTON(25)
  1317. #define DIJOFS_BUTTON26     DIJOFS_BUTTON(26)
  1318. #define DIJOFS_BUTTON27     DIJOFS_BUTTON(27)
  1319. #define DIJOFS_BUTTON28     DIJOFS_BUTTON(28)
  1320. #define DIJOFS_BUTTON29     DIJOFS_BUTTON(29)
  1321. #define DIJOFS_BUTTON30     DIJOFS_BUTTON(30)
  1322. #define DIJOFS_BUTTON31     DIJOFS_BUTTON(31)
  1323.  
  1324.  
  1325. #endif /* DIJ_RINGZERO */
  1326.  
  1327. /****************************************************************************
  1328.  *
  1329.  *  IDirectInput
  1330.  *
  1331.  ****************************************************************************/
  1332.  
  1333. #ifndef DIJ_RINGZERO
  1334.  
  1335. #define DIENUM_STOP             0
  1336. #define DIENUM_CONTINUE         1
  1337.  
  1338. typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA, LPVOID);
  1339. typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW, LPVOID);
  1340. #ifdef UNICODE
  1341. #define LPDIENUMDEVICESCALLBACK  LPDIENUMDEVICESCALLBACKW
  1342. #else
  1343. #define LPDIENUMDEVICESCALLBACK  LPDIENUMDEVICESCALLBACKA
  1344. #endif // !UNICODE
  1345.  
  1346. #define DIEDFL_ALLDEVICES       0x00000000
  1347. #define DIEDFL_ATTACHEDONLY     0x00000001
  1348. #if(DIRECTINPUT_VERSION >= 0x0500)
  1349. #define DIEDFL_FORCEFEEDBACK    0x00000100
  1350. #endif /* DIRECTINPUT_VERSION >= 0x0500 */
  1351.  
  1352. #undef INTERFACE
  1353. #define INTERFACE IDirectInputW
  1354.  
  1355. DECLARE_INTERFACE_(IDirectInputW, IUnknown)
  1356. {
  1357.     /*** IUnknown methods ***/
  1358.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  1359.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  1360.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  1361.  
  1362.     /*** IDirectInputW methods ***/
  1363.     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE;
  1364.     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE;
  1365.     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
  1366.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  1367.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
  1368. };
  1369.  
  1370. typedef struct IDirectInputW *LPDIRECTINPUTW;
  1371.  
  1372. #undef INTERFACE
  1373. #define INTERFACE IDirectInputA
  1374.  
  1375. DECLARE_INTERFACE_(IDirectInputA, IUnknown)
  1376. {
  1377.     /*** IUnknown methods ***/
  1378.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  1379.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  1380.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  1381.  
  1382.     /*** IDirectInputA methods ***/
  1383.     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE;
  1384.     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE;
  1385.     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
  1386.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  1387.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
  1388. };
  1389.  
  1390. typedef struct IDirectInputA *LPDIRECTINPUTA;
  1391.  
  1392. #ifdef UNICODE
  1393. #define IID_IDirectInput IID_IDirectInputW
  1394. #define IDirectInput IDirectInputW
  1395. #define IDirectInputVtbl IDirectInputWVtbl
  1396. #else
  1397. #define IID_IDirectInput IID_IDirectInputA
  1398. #define IDirectInput IDirectInputA
  1399. #define IDirectInputVtbl IDirectInputAVtbl
  1400. #endif
  1401. typedef struct IDirectInput *LPDIRECTINPUT;
  1402.  
  1403. #if !defined(__cplusplus) || defined(CINTERFACE)
  1404. #define IDirectInput_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  1405. #define IDirectInput_AddRef(p) (p)->lpVtbl->AddRef(p)
  1406. #define IDirectInput_Release(p) (p)->lpVtbl->Release(p)
  1407. #define IDirectInput_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c)
  1408. #define IDirectInput_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)
  1409. #define IDirectInput_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a)
  1410. #define IDirectInput_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
  1411. #define IDirectInput_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
  1412. #else
  1413. #define IDirectInput_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
  1414. #define IDirectInput_AddRef(p) (p)->AddRef()
  1415. #define IDirectInput_Release(p) (p)->Release()
  1416. #define IDirectInput_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c)
  1417. #define IDirectInput_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d)
  1418. #define IDirectInput_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a)
  1419. #define IDirectInput_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b)
  1420. #define IDirectInput_Initialize(p,a,b) (p)->Initialize(a,b)
  1421. #endif
  1422.  
  1423. #undef INTERFACE
  1424. #define INTERFACE IDirectInput2W
  1425.  
  1426. DECLARE_INTERFACE_(IDirectInput2W, IDirectInputW)
  1427. {
  1428.     /*** IUnknown methods ***/
  1429.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  1430.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  1431.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  1432.  
  1433.     /*** IDirectInputW methods ***/
  1434.     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE;
  1435.     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE;
  1436.     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
  1437.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  1438.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
  1439.  
  1440.     /*** IDirectInput2W methods ***/
  1441.     STDMETHOD(FindDevice)(THIS_ REFGUID,LPCWSTR,LPGUID) PURE;
  1442. };
  1443.  
  1444. typedef struct IDirectInput2W *LPDIRECTINPUT2W;
  1445.  
  1446. #undef INTERFACE
  1447. #define INTERFACE IDirectInput2A
  1448.  
  1449. DECLARE_INTERFACE_(IDirectInput2A, IDirectInputA)
  1450. {
  1451.     /*** IUnknown methods ***/
  1452.     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
  1453.     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  1454.     STDMETHOD_(ULONG,Release)(THIS) PURE;
  1455.  
  1456.     /*** IDirectInputA methods ***/
  1457.     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE;
  1458.     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE;
  1459.     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
  1460.     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
  1461.     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
  1462.  
  1463.     /*** IDirectInput2A methods ***/
  1464.     STDMETHOD(FindDevice)(THIS_ REFGUID,LPCSTR,LPGUID) PURE;
  1465. };
  1466.  
  1467. typedef struct IDirectInput2A *LPDIRECTINPUT2A;
  1468.  
  1469. #ifdef UNICODE
  1470. #define IID_IDirectInput2 IID_IDirectInput2W
  1471. #define IDirectInput2 IDirectInput2W
  1472. #define IDirectInput2Vtbl IDirectInput2WVtbl
  1473. #else
  1474. #define IID_IDirectInput2 IID_IDirectInput2A
  1475. #define IDirectInput2 IDirectInput2A
  1476. #define IDirectInput2Vtbl IDirectInput2AVtbl
  1477. #endif
  1478. typedef struct IDirectInput2 *LPDIRECTINPUT2;
  1479.  
  1480. #if !defined(__cplusplus) || defined(CINTERFACE)
  1481. #define IDirectInput2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
  1482. #define IDirectInput2_AddRef(p) (p)->lpVtbl->AddRef(p)
  1483. #define IDirectInput2_Release(p) (p)->lpVtbl->Release(p)
  1484. #define IDirectInput2_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c)
  1485. #define IDirectInput2_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)
  1486. #define IDirectInput2_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a)
  1487. #define IDirectInput2_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
  1488. #define IDirectInput2_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
  1489. #define IDirectInput2_FindDevice(p,a,b,c) (p)->lpVtbl->FindDevice(p,a,b,c)
  1490. #else
  1491. #define IDirectInput2_QueryInterface(p,a,b) (p)->QueryInterface(a,b)
  1492. #define IDirectInput2_AddRef(p) (p)->AddRef()
  1493. #define IDirectInput2_Release(p) (p)->Release()
  1494. #define IDirectInput2_CreateDevice(p,a,b,c) (p)->CreateDevice(a,b,c)
  1495. #define IDirectInput2_EnumDevices(p,a,b,c,d) (p)->EnumDevices(a,b,c,d)
  1496. #define IDirectInput2_GetDeviceStatus(p,a) (p)->GetDeviceStatus(a)
  1497. #define IDirectInput2_RunControlPanel(p,a,b) (p)->RunControlPanel(a,b)
  1498. #define IDirectInput2_Initialize(p,a,b) (p)->Initialize(a,b)
  1499. #define IDirectInput2_FindDevice(p,a,b,c) (p)->FindDevice(a,b,c)
  1500. #endif
  1501.  
  1502. extern HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter);
  1503. extern HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTW *ppDI, LPUNKNOWN punkOuter);
  1504. #ifdef UNICODE
  1505. #define DirectInputCreate  DirectInputCreateW
  1506. #else
  1507. #define DirectInputCreate  DirectInputCreateA
  1508. #endif // !UNICODE
  1509.  
  1510. #endif /* DIJ_RINGZERO */
  1511.  
  1512.  
  1513. /****************************************************************************
  1514.  *
  1515.  *  Return Codes
  1516.  *
  1517.  ****************************************************************************/
  1518.  
  1519. /*
  1520.  *  The operation completed successfully.
  1521.  */
  1522. #define DI_OK                           S_OK
  1523.  
  1524. /*
  1525.  *  The device exists but is not currently attached.
  1526.  */
  1527. #define DI_NOTATTACHED                  S_FALSE
  1528.  
  1529. /*
  1530.  *  The device buffer overflowed.  Some input was lost.
  1531.  */
  1532. #define DI_BUFFEROVERFLOW               S_FALSE
  1533.  
  1534. /*
  1535.  *  The change in device properties had no effect.
  1536.  */
  1537. #define DI_PROPNOEFFECT                 S_FALSE
  1538.  
  1539. /*
  1540.  *  The operation had no effect.
  1541.  */
  1542. #define DI_NOEFFECT                     S_FALSE
  1543.  
  1544. /*
  1545.  *  The device is a polled device.  As a result, device buffering
  1546.  *  will not collect any data and event notifications will not be
  1547.  *  signalled until GetDeviceState is called.
  1548.  */
  1549. #define DI_POLLEDDEVICE                 ((HRESULT)0x00000002L)
  1550.  
  1551. /*
  1552.  *  The parameters of the effect were successfully updated by
  1553.  *  IDirectInputEffect::SetParameters, but the effect was not
  1554.  *  downloaded because the device is not exclusively acquired
  1555.  *  or because the DIEP_NODOWNLOAD flag was passed.
  1556.  */
  1557. #define DI_DOWNLOADSKIPPED              ((HRESULT)0x00000003L)
  1558.  
  1559. /*
  1560.  *  The parameters of the effect were successfully updated by
  1561.  *  IDirectInputEffect::SetParameters, but in order to change
  1562.  *  the parameters, the effect needed to be restarted.
  1563.  */
  1564. #define DI_EFFECTRESTARTED              ((HRESULT)0x00000004L)
  1565.  
  1566. /*
  1567.  *  The parameters of the effect were successfully updated by
  1568.  *  IDirectInputEffect::SetParameters, but some of them were
  1569.  *  beyond the capabilities of the device and were truncated.
  1570.  */
  1571. #define DI_TRUNCATED                    ((HRESULT)0x00000008L)
  1572.  
  1573. /*
  1574.  *  Equal to DI_EFFECTRESTARTED | DI_TRUNCATED.
  1575.  */
  1576. #define DI_TRUNCATEDANDRESTARTED        ((HRESULT)0x0000000CL)
  1577.  
  1578. /*
  1579.  *  The application requires a newer version of DirectInput.
  1580.  */
  1581. #define DIERR_OLDDIRECTINPUTVERSION     \
  1582.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION)
  1583.  
  1584. /*
  1585.  *  The application was written for an unsupported prerelease version
  1586.  *  of DirectInput.
  1587.  */
  1588. #define DIERR_BETADIRECTINPUTVERSION    \
  1589.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP)
  1590.  
  1591. /*
  1592.  *  The object could not be created due to an incompatible driver version
  1593.  *  or mismatched or incomplete driver components.
  1594.  */
  1595. #define DIERR_BADDRIVERVER              \
  1596.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL)
  1597.  
  1598. /*
  1599.  * The device or device instance or effect is not registered with DirectInput.
  1600.  */
  1601. #define DIERR_DEVICENOTREG              REGDB_E_CLASSNOTREG
  1602.  
  1603. /*
  1604.  * The requested object does not exist.
  1605.  */
  1606. #define DIERR_NOTFOUND                  \
  1607.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
  1608.  
  1609. /*
  1610.  * The requested object does not exist.
  1611.  */
  1612. #define DIERR_OBJECTNOTFOUND            \
  1613.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
  1614.  
  1615. /*
  1616.  * An invalid parameter was passed to the returning function,
  1617.  * or the object was not in a state that admitted the function
  1618.  * to be called.
  1619.  */
  1620. #define DIERR_INVALIDPARAM              E_INVALIDARG
  1621.  
  1622. /*
  1623.  * The specified interface is not supported by the object
  1624.  */
  1625. #define DIERR_NOINTERFACE               E_NOINTERFACE
  1626.  
  1627. /*
  1628.  * An undetermined error occured inside the DInput subsystem
  1629.  */
  1630. #define DIERR_GENERIC                   E_FAIL
  1631.  
  1632. /*
  1633.  * The DInput subsystem couldn't allocate sufficient memory to complete the
  1634.  * caller's request.
  1635.  */
  1636. #define DIERR_OUTOFMEMORY               E_OUTOFMEMORY
  1637.  
  1638. /*
  1639.  * The function called is not supported at this time
  1640.  */
  1641. #define DIERR_UNSUPPORTED               E_NOTIMPL
  1642.  
  1643. /*
  1644.  * This object has not been initialized
  1645.  */
  1646. #define DIERR_NOTINITIALIZED            \
  1647.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY)
  1648.  
  1649. /*
  1650.  * This object is already initialized
  1651.  */
  1652. #define DIERR_ALREADYINITIALIZED        \
  1653.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED)
  1654.  
  1655. /*
  1656.  * This object does not support aggregation
  1657.  */
  1658. #define DIERR_NOAGGREGATION             CLASS_E_NOAGGREGATION
  1659.  
  1660. /*
  1661.  * Another app has a higher priority level, preventing this call from
  1662.  * succeeding.
  1663.  */
  1664. #define DIERR_OTHERAPPHASPRIO           E_ACCESSDENIED
  1665.  
  1666. /*
  1667.  * Access to the device has been lost.  It must be re-acquired.
  1668.  */
  1669. #define DIERR_INPUTLOST                 \
  1670.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT)
  1671.  
  1672. /*
  1673.  * The operation cannot be performed while the device is acquired.
  1674.  */
  1675. #define DIERR_ACQUIRED                  \
  1676.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY)
  1677.  
  1678. /*
  1679.  * The operation cannot be performed unless the device is acquired.
  1680.  */
  1681. #define DIERR_NOTACQUIRED               \
  1682.     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS)
  1683.  
  1684. /*
  1685.  * The specified property cannot be changed.
  1686.  */
  1687. #define DIERR_READONLY                  E_ACCESSDENIED
  1688.  
  1689. /*
  1690.  * The device already has an event notification associated with it.
  1691.  */
  1692. #define DIERR_HANDLEEXISTS              E_ACCESSDENIED
  1693.  
  1694. /*
  1695.  * Data is not yet available.
  1696.  */
  1697. #ifndef E_PENDING
  1698. #define E_PENDING                       0x8000000AL
  1699. #endif
  1700.  
  1701. /*
  1702.  * Unable to IDirectInputJoyConfig_Acquire because the user
  1703.  * does not have sufficient privileges to change the joystick
  1704.  * configuration.
  1705.  */
  1706. #define DIERR_INSUFFICIENTPRIVS         0x80040200L
  1707.  
  1708. /*
  1709.  * The device is full.
  1710.  */
  1711. #define DIERR_DEVICEFULL                0x80040201L
  1712.  
  1713. /*
  1714.  * Not all the requested information fit into the buffer.
  1715.  */
  1716. #define DIERR_MOREDATA                  0x80040202L
  1717.  
  1718. /*
  1719.  * The effect is not downloaded.
  1720.  */
  1721. #define DIERR_NOTDOWNLOADED             0x80040203L
  1722.  
  1723. /*
  1724.  *  The device cannot be reinitialized because there are still effects
  1725.  *  attached to it.
  1726.  */
  1727. #define DIERR_HASEFFECTS                0x80040204L
  1728.  
  1729. /*
  1730.  *  The operation cannot be performed unless the device is acquired
  1731.  *  in DISCL_EXCLUSIVE mode.
  1732.  */
  1733. #define DIERR_NOTEXCLUSIVEACQUIRED      0x80040205L
  1734.  
  1735. /*
  1736.  *  The effect could not be downloaded because essential information
  1737.  *  is missing.  For example, no axes have been associated with the
  1738.  *  effect, or no type-specific information has been created.
  1739.  */
  1740. #define DIERR_INCOMPLETEEFFECT          0x80040206L
  1741.  
  1742. /*
  1743.  *  Attempted to read buffered device data from a device that is
  1744.  *  not buffered.
  1745.  */
  1746. #define DIERR_NOTBUFFERED               0x80040207L
  1747.  
  1748. /*
  1749.  *  An attempt was made to modify parameters of an effect while it is
  1750.  *  playing.  Not all hardware devices support altering the parameters
  1751.  *  of an effect while it is playing.
  1752.  */
  1753. #define DIERR_EFFECTPLAYING             0x80040208L
  1754.  
  1755. /*
  1756.  *  The operation could not be completed because the device is not
  1757.  *  plugged in.
  1758.  */
  1759. #define DIERR_UNPLUGGED                 0x80040209L
  1760.  
  1761. /*
  1762.  *  SendDeviceData failed because more information was requested
  1763.  *  to be sent than can be sent to the device.  Some devices have
  1764.  *  restrictions on how much data can be sent to them.  (For example,
  1765.  *  there might be a limit on the number of buttons that can be
  1766.  *  pressed at once.)
  1767.  */
  1768. #define DIERR_REPORTFULL                0x8004020AL
  1769.  
  1770. #ifdef __cplusplus
  1771. };
  1772. #endif
  1773.  
  1774. #endif  /* __DINPUT_INCLUDED__ */
  1775.  
  1776. /****************************************************************************
  1777.  *
  1778.  *  Definitions for non-IDirectInput (VJoyD) features defined more recently
  1779.  *  than the current sdk files
  1780.  *
  1781.  ****************************************************************************/
  1782.  
  1783. #ifdef _INC_MMSYSTEM
  1784. #ifndef MMNOJOY
  1785.  
  1786. #ifndef __VJOYDX_INCLUDED__
  1787. #define __VJOYDX_INCLUDED__
  1788.  
  1789. #ifdef __cplusplus
  1790. extern "C" {
  1791. #endif
  1792.  
  1793. /*
  1794.  * Flag to indicate that the dwReserved2 field of the JOYINFOEX structure
  1795.  * contains mini-driver specific data to be passed by VJoyD to the mini-
  1796.  * driver instead of doing a poll.
  1797.  */
  1798. #define JOY_PASSDRIVERDATA          0x10000000l
  1799.  
  1800. /*
  1801.  * Informs the joystick driver that the configuration has been changed
  1802.  * and should be reloaded from the registery.
  1803.  * dwFlags is reserved and should be set to zero
  1804.  */
  1805. WINMMAPI MMRESULT WINAPI joyConfigChanged( DWORD dwFlags );
  1806.  
  1807. /*
  1808.  * Hardware Setting indicating that the device is a headtracker
  1809.  */
  1810. #define JOY_HWS_ISHEADTRACKER       0x02000000l
  1811.  
  1812. /*
  1813.  * Hardware Setting indicating that the VxD is used to replace
  1814.  * the standard analog polling
  1815.  */
  1816. #define JOY_HWS_ISGAMEPORTDRIVER    0x04000000l
  1817.  
  1818. /*
  1819.  * Hardware Setting indicating that the driver needs a standard
  1820.  * gameport in order to communicate with the device.
  1821.  */
  1822. #define JOY_HWS_ISANALOGPORTDRIVER  0x08000000l 
  1823.  
  1824. /*
  1825.  * Hardware Setting indicating that VJoyD should not load this 
  1826.  * driver, it will be loaded externally and will register with
  1827.  * VJoyD of it's own accord.
  1828.  */
  1829. #define JOY_HWS_AUTOLOAD            0x10000000l
  1830.  
  1831. /*
  1832.  * Hardware Setting indicating that the driver acquires any 
  1833.  * resources needed without needing a devnode through VJoyD.
  1834.  */
  1835. #define JOY_HWS_NODEVNODE           0x20000000l
  1836.  
  1837. /*
  1838.  * Hardware Setting indicating that the VxD can be used as
  1839.  * a port 201h emulator.
  1840.  */
  1841. #define JOY_HWS_ISGAMEPORTEMULATOR  0x40000000l
  1842.  
  1843.  
  1844. /*
  1845.  * Usage Setting indicating that the settings are volatile and
  1846.  * should be removed if still present on a reboot.
  1847.  */
  1848. #define JOY_US_VOLATILE             0x00000008L
  1849.  
  1850. #ifdef __cplusplus
  1851. };
  1852. #endif
  1853.  
  1854. #endif  /* __VJOYDX_INCLUDED__ */
  1855.  
  1856. #endif  /* not MMNOJOY */
  1857. #endif  /* _INC_MMSYSTEM */
  1858.  
  1859. /****************************************************************************
  1860.  *
  1861.  *  Definitions for non-IDirectInput (VJoyD) features defined more recently
  1862.  *  than the current ddk files
  1863.  *
  1864.  ****************************************************************************/
  1865.  
  1866. #ifndef DIJ_RINGZERO
  1867.  
  1868. #ifdef _INC_MMDDK
  1869. #ifndef MMNOJOYDEV
  1870.  
  1871. #ifndef __VJOYDXD_INCLUDED__
  1872. #define __VJOYDXD_INCLUDED__
  1873. /*
  1874.  * Poll type in which the do_other field of the JOYOEMPOLLDATA
  1875.  * structure contains mini-driver specific data passed from an app.
  1876.  */
  1877. #define JOY_OEMPOLL_PASSDRIVERDATA  7
  1878.  
  1879. #endif  /* __VJOYDXD_INCLUDED__ */
  1880.  
  1881. #endif  /* not MMNOJOYDEV */
  1882. #endif  /* _INC_MMDDK */
  1883.  
  1884. #endif /* DIJ_RINGZERO */
  1885. #pragma option pop /*P_O_Pop*/
  1886.