home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / include / dinput.h < prev    next >
C/C++ Source or Header  |  1998-04-25  |  74KB  |  1,884 lines

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