Home | History | Annotate | Download | only in inc
      1 /****************************************************************************
      2  *
      3  *  Copyright (C) 1996 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 #ifdef _WIN32
     14 #define COM_NO_WINDOWS_H
     15 #include <objbase.h>
     16 #endif
     17 
     18 #ifdef __cplusplus
     19 extern "C" {
     20 #endif
     21 
     22 #define DIRECTINPUT_VERSION         0x0300
     23 
     24 /****************************************************************************
     25  *
     26  *      Class IDs
     27  *
     28  ****************************************************************************/
     29 
     30 DEFINE_GUID(CLSID_DirectInput,      0x25E609E0,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     31 DEFINE_GUID(CLSID_DirectInputDevice,0x25E609E1,0xB259,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     32 
     33 /****************************************************************************
     34  *
     35  *      Interfaces
     36  *
     37  ****************************************************************************/
     38 
     39 DEFINE_GUID(IID_IDirectInputA,     0x89521360,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     40 DEFINE_GUID(IID_IDirectInputW,     0x89521361,0xAA8A,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     41 
     42 DEFINE_GUID(IID_IDirectInputDeviceA,0x5944E680,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     43 DEFINE_GUID(IID_IDirectInputDeviceW,0x5944E681,0xC92E,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     44 
     45 /****************************************************************************
     46  *
     47  *      Predefined object types
     48  *
     49  ****************************************************************************/
     50 
     51 DEFINE_GUID(GUID_XAxis,   0xA36D02E0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     52 DEFINE_GUID(GUID_YAxis,   0xA36D02E1,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     53 DEFINE_GUID(GUID_ZAxis,   0xA36D02E2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     54 DEFINE_GUID(GUID_RAxis,   0xA36D02E3,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     55 DEFINE_GUID(GUID_UAxis,   0xA36D02E4,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     56 DEFINE_GUID(GUID_VAxis,   0xA36D02E5,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     57 
     58 DEFINE_GUID(GUID_Button,  0xA36D02F0,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     59 DEFINE_GUID(GUID_Key,     0x55728220,0xD33C,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     60 
     61 DEFINE_GUID(GUID_POV,     0xA36D02F2,0xC9F3,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     62 
     63 /****************************************************************************
     64  *
     65  *      Predefined product GUIDs
     66  *
     67  ****************************************************************************/
     68 
     69 DEFINE_GUID(GUID_SysMouse,   0x6F1D2B60,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     70 DEFINE_GUID(GUID_SysKeyboard,0x6F1D2B61,0xD5A0,0x11CF,0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00);
     71 
     72 /****************************************************************************
     73  *
     74  *      Interfaces and Structures...
     75  *
     76  ****************************************************************************/
     77 
     78 /****************************************************************************
     79  *
     80  *      IDirectInputDevice
     81  *
     82  ****************************************************************************/
     83 
     84 #define DIDEVTYPE_DEVICE    1
     85 #define DIDEVTYPE_MOUSE     2
     86 #define DIDEVTYPE_KEYBOARD  3
     87 #define DIDEVTYPE_JOYSTICK  4
     88 
     89 #define DIDEVTYPEMOUSE_UNKNOWN          1
     90 #define DIDEVTYPEMOUSE_TRADITIONAL      2
     91 #define DIDEVTYPEMOUSE_FINGERSTICK      3
     92 #define DIDEVTYPEMOUSE_TOUCHPAD         4
     93 #define DIDEVTYPEMOUSE_TRACKBALL        5
     94 
     95 #define DIDEVTYPEKEYBOARD_PCXT          1
     96 #define DIDEVTYPEKEYBOARD_OLIVETTI      2
     97 #define DIDEVTYPEKEYBOARD_PCAT          3
     98 #define DIDEVTYPEKEYBOARD_PCENH         4
     99 #define DIDEVTYPEKEYBOARD_NOKIA1050     5
    100 #define DIDEVTYPEKEYBOARD_NOKIA9140     6
    101 #define DIDEVTYPEKEYBOARD_NEC98         7
    102 #define DIDEVTYPEKEYBOARD_NEC98LAPTOP   8
    103 #define DIDEVTYPEKEYBOARD_NEC98106      9
    104 #define DIDEVTYPEKEYBOARD_JAPAN106     10
    105 #define DIDEVTYPEKEYBOARD_JAPANAX      11
    106 #define DIDEVTYPEKEYBOARD_J3100        12
    107 
    108 #define GET_DIDEVICE_TYPE(dwDevType)    LOBYTE(dwDevType)
    109 #define GET_DIDEVICE_SUBTYPE(dwDevType) HIBYTE(dwDevType)
    110 
    111 typedef struct _DIDEVCAPS {
    112     DWORD   dwSize;
    113     DWORD   dwFlags;
    114     DWORD   dwDevType;
    115     DWORD   dwAxes;
    116     DWORD   dwButtons;
    117     DWORD   dwPOVs;
    118 } DIDEVCAPS, *LPDIDEVCAPS;
    119 
    120 #define DIDC_ATTACHED           0x00000001
    121 #define DIDC_POLLEDDEVICE       0x00000002
    122 
    123 #define DIDFT_ALL           0x00000000
    124 
    125 #define DIDFT_RELAXIS       0x00000001
    126 #define DIDFT_ABSAXIS       0x00000002
    127 #define DIDFT_AXIS          0x00000003
    128 
    129 #define DIDFT_PSHBUTTON     0x00000004
    130 #define DIDFT_TGLBUTTON     0x00000008
    131 #define DIDFT_BUTTON        0x0000000C
    132 
    133 #define DIDFT_POV           0x00000010
    134 
    135 #define DIDFT_ANYINSTANCE   0x0000FF00
    136 #define DIDFT_MAKEINSTANCE(n) ((BYTE)(n) << 8)
    137 #define DIDFT_GETTYPE(n)     LOBYTE(n)
    138 #define DIDFT_GETINSTANCE(n) HIBYTE(n)
    139 
    140 typedef struct _DIOBJECTDATAFORMAT {
    141     const GUID *pguid;
    142     DWORD   dwOfs;
    143     DWORD   dwType;
    144     DWORD   dwFlags;
    145 } DIOBJECTDATAFORMAT, *LPDIOBJECTDATAFORMAT;
    146 typedef const DIOBJECTDATAFORMAT *LPCDIOBJECTDATAFORMAT;
    147 
    148 typedef struct _DIDATAFORMAT {
    149     DWORD   dwSize;
    150     DWORD   dwObjSize;
    151     DWORD   dwFlags;
    152     DWORD   dwDataSize;
    153     DWORD   dwNumObjs;
    154     LPDIOBJECTDATAFORMAT rgodf;
    155 } DIDATAFORMAT, *LPDIDATAFORMAT;
    156 typedef const DIDATAFORMAT *LPCDIDATAFORMAT;
    157 
    158 #define DIDF_ABSAXIS            0x00000001
    159 #define DIDF_RELAXIS            0x00000002
    160 
    161 extern const DIDATAFORMAT c_dfDIMouse;
    162 extern const DIDATAFORMAT c_dfDIKeyboard;
    163 
    164 typedef struct DIDEVICEOBJECTINSTANCEA {
    165     DWORD   dwSize;
    166     GUID    guidType;
    167     DWORD   dwOfs;
    168     DWORD   dwType;
    169     DWORD   dwFlags;
    170     CHAR    tszName[MAX_PATH];
    171 } DIDEVICEOBJECTINSTANCEA, *LPDIDEVICEOBJECTINSTANCEA;
    172 typedef struct DIDEVICEOBJECTINSTANCEW {
    173     DWORD   dwSize;
    174     GUID    guidType;
    175     DWORD   dwOfs;
    176     DWORD   dwType;
    177     DWORD   dwFlags;
    178     WCHAR   tszName[MAX_PATH];
    179 } DIDEVICEOBJECTINSTANCEW, *LPDIDEVICEOBJECTINSTANCEW;
    180 #ifdef UNICODE
    181 typedef DIDEVICEOBJECTINSTANCEW DIDEVICEOBJECTINSTANCE;
    182 typedef LPDIDEVICEOBJECTINSTANCEW LPDIDEVICEOBJECTINSTANCE;
    183 #else
    184 typedef DIDEVICEOBJECTINSTANCEA DIDEVICEOBJECTINSTANCE;
    185 typedef LPDIDEVICEOBJECTINSTANCEA LPDIDEVICEOBJECTINSTANCE;
    186 #endif // UNICODE
    187 typedef const DIDEVICEOBJECTINSTANCEA *LPCDIDEVICEOBJECTINSTANCEA;
    188 typedef const DIDEVICEOBJECTINSTANCEW *LPCDIDEVICEOBJECTINSTANCEW;
    189 typedef const DIDEVICEOBJECTINSTANCE  *LPCDIDEVICEOBJECTINSTANCE;
    190 
    191 typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKA)(LPCDIDEVICEOBJECTINSTANCEA, LPVOID);
    192 typedef BOOL (FAR PASCAL * LPDIENUMDEVICEOBJECTSCALLBACKW)(LPCDIDEVICEOBJECTINSTANCEW, LPVOID);
    193 #ifdef UNICODE
    194 #define LPDIENUMDEVICEOBJECTSCALLBACK  LPDIENUMDEVICEOBJECTSCALLBACKW
    195 #else
    196 #define LPDIENUMDEVICEOBJECTSCALLBACK  LPDIENUMDEVICEOBJECTSCALLBACKA
    197 #endif // !UNICODE
    198 
    199 typedef struct DIPROPHEADER {
    200     DWORD   dwSize;
    201     DWORD   dwHeaderSize;
    202     DWORD   dwObj;
    203     DWORD   dwHow;
    204 } DIPROPHEADER, *LPDIPROPHEADER;
    205 typedef const DIPROPHEADER *LPCDIPROPHEADER;
    206 
    207 #define DIPH_DEVICE             0
    208 #define DIPH_BYOFFSET           1
    209 #define DIPH_BYID               2
    210 
    211 typedef struct DIPROPDWORD {
    212     DIPROPHEADER diph;
    213     DWORD   dwData;
    214 } DIPROPDWORD, *LPDIPROPDWORD;
    215 typedef const DIPROPDWORD *LPCDIPROPDWORD;
    216 
    217 typedef struct DIPROPRANGE {
    218     DIPROPHEADER diph;
    219     LONG    lMin;
    220     LONG    lMax;
    221 } DIPROPRANGE, *LPDIPROPRANGE;
    222 typedef const DIPROPRANGE *LPCDIPROPRANGE;
    223 
    224 #define DIPROPRANGE_NOMIN       ((LONG)0x80000000)
    225 #define DIPROPRANGE_NOMAX       ((LONG)0x7FFFFFFF)
    226 
    227 #ifdef __cplusplus
    228 #define MAKEDIPROP(prop)    (*(const GUID *)(prop))
    229 #else
    230 #define MAKEDIPROP(prop)    ((REFGUID)(prop))
    231 #endif
    232 
    233 #define DIPROP_BUFFERSIZE       MAKEDIPROP(1)
    234 
    235 #define DIPROP_AXISMODE         MAKEDIPROP(2)
    236 
    237 #define DIPROPAXISMODE_ABS      0
    238 #define DIPROPAXISMODE_REL      1
    239 
    240 #define DIPROP_GRANULARITY      MAKEDIPROP(3)
    241 
    242 #define DIPROP_RANGE            MAKEDIPROP(4)
    243 
    244 typedef struct DIDEVICEOBJECTDATA {
    245     DWORD   dwOfs;
    246     DWORD   dwData;
    247     DWORD   dwTimeStamp;
    248     DWORD   dwSequence;
    249 } DIDEVICEOBJECTDATA, *LPDIDEVICEOBJECTDATA;
    250 
    251 #define DIGDD_PEEK          0x00000001
    252 
    253 #define DISEQUENCE_COMPARE(dwSequence1, cmp, dwSequence2) \
    254                         ((int)((dwSequence1) - (dwSequence2)) cmp 0)
    255 
    256 #define DISCL_EXCLUSIVE     0x00000001
    257 #define DISCL_NONEXCLUSIVE  0x00000002
    258 #define DISCL_FOREGROUND    0x00000004
    259 #define DISCL_BACKGROUND    0x00000008
    260 
    261 typedef struct DIDEVICEINSTANCEA {
    262     DWORD   dwSize;
    263     GUID    guidInstance;
    264     GUID    guidProduct;
    265     DWORD   dwDevType;
    266     CHAR    tszInstanceName[MAX_PATH];
    267     CHAR    tszProductName[MAX_PATH];
    268 } DIDEVICEINSTANCEA, *LPDIDEVICEINSTANCEA;
    269 typedef struct DIDEVICEINSTANCEW {
    270     DWORD   dwSize;
    271     GUID    guidInstance;
    272     GUID    guidProduct;
    273     DWORD   dwDevType;
    274     WCHAR   tszInstanceName[MAX_PATH];
    275     WCHAR   tszProductName[MAX_PATH];
    276 } DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW;
    277 #ifdef UNICODE
    278 typedef DIDEVICEINSTANCEW DIDEVICEINSTANCE;
    279 typedef LPDIDEVICEINSTANCEW LPDIDEVICEINSTANCE;
    280 #else
    281 typedef DIDEVICEINSTANCEA DIDEVICEINSTANCE;
    282 typedef LPDIDEVICEINSTANCEA LPDIDEVICEINSTANCE;
    283 #endif // UNICODE
    284 typedef const DIDEVICEINSTANCEA *LPCDIDEVICEINSTANCEA;
    285 typedef const DIDEVICEINSTANCEW *LPCDIDEVICEINSTANCEW;
    286 typedef const DIDEVICEINSTANCE  *LPCDIDEVICEINSTANCE;
    287 
    288 #undef INTERFACE
    289 #define INTERFACE IDirectInputDeviceW
    290 
    291 DECLARE_INTERFACE_(IDirectInputDeviceW, IUnknown)
    292 {
    293     /*** IUnknown methods ***/
    294     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
    295     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    296     STDMETHOD_(ULONG,Release)(THIS) PURE;
    297 
    298     /*** IDirectInputDeviceW methods ***/
    299     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
    300     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKW,LPVOID,DWORD) PURE;
    301     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
    302     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
    303     STDMETHOD(Acquire)(THIS) PURE;
    304     STDMETHOD(Unacquire)(THIS) PURE;
    305     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
    306     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
    307     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
    308     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
    309     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
    310     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEW,DWORD,DWORD) PURE;
    311     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEW) PURE;
    312     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
    313     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
    314 };
    315 
    316 typedef struct IDirectInputDeviceW *LPDIRECTINPUTDEVICEW;
    317 
    318 #undef INTERFACE
    319 #define INTERFACE IDirectInputDeviceA
    320 
    321 DECLARE_INTERFACE_(IDirectInputDeviceA, IUnknown)
    322 {
    323     /*** IUnknown methods ***/
    324     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
    325     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    326     STDMETHOD_(ULONG,Release)(THIS) PURE;
    327 
    328     /*** IDirectInputDeviceA methods ***/
    329     STDMETHOD(GetCapabilities)(THIS_ LPDIDEVCAPS) PURE;
    330     STDMETHOD(EnumObjects)(THIS_ LPDIENUMDEVICEOBJECTSCALLBACKA,LPVOID,DWORD) PURE;
    331     STDMETHOD(GetProperty)(THIS_ REFGUID,LPDIPROPHEADER) PURE;
    332     STDMETHOD(SetProperty)(THIS_ REFGUID,LPCDIPROPHEADER) PURE;
    333     STDMETHOD(Acquire)(THIS) PURE;
    334     STDMETHOD(Unacquire)(THIS) PURE;
    335     STDMETHOD(GetDeviceState)(THIS_ DWORD,LPVOID) PURE;
    336     STDMETHOD(GetDeviceData)(THIS_ DWORD,LPDIDEVICEOBJECTDATA,LPDWORD,DWORD) PURE;
    337     STDMETHOD(SetDataFormat)(THIS_ LPCDIDATAFORMAT) PURE;
    338     STDMETHOD(SetEventNotification)(THIS_ HANDLE) PURE;
    339     STDMETHOD(SetCooperativeLevel)(THIS_ HWND,DWORD) PURE;
    340     STDMETHOD(GetObjectInfo)(THIS_ LPDIDEVICEOBJECTINSTANCEA,DWORD,DWORD) PURE;
    341     STDMETHOD(GetDeviceInfo)(THIS_ LPDIDEVICEINSTANCEA) PURE;
    342     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
    343     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD,REFGUID) PURE;
    344 };
    345 
    346 typedef struct IDirectInputDeviceA *LPDIRECTINPUTDEVICEA;
    347 
    348 #ifdef UNICODE
    349 #define IID_IDirectInputDevice IID_IDirectInputDeviceW
    350 #define IDirectInputDevice IDirectInputDeviceW
    351 #define IDirectInputDeviceVtbl IDirectInputDeviceWVtbl
    352 #else
    353 #define IID_IDirectInputDevice IID_IDirectInputDeviceA
    354 #define IDirectInputDevice IDirectInputDeviceA
    355 #define IDirectInputDeviceVtbl IDirectInputDeviceAVtbl
    356 #endif
    357 typedef struct IDirectInputDevice *LPDIRECTINPUTDEVICE;
    358 
    359 #if !defined(__cplusplus) || defined(CINTERFACE)
    360 #define IDirectInputDevice_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
    361 #define IDirectInputDevice_AddRef(p) (p)->lpVtbl->AddRef(p)
    362 #define IDirectInputDevice_Release(p) (p)->lpVtbl->Release(p)
    363 #define IDirectInputDevice_GetCapabilities(p,a) (p)->lpVtbl->GetCapabilities(p,a)
    364 #define IDirectInputDevice_EnumObjects(p,a,b,c) (p)->lpVtbl->EnumObjects(p,a,b,c)
    365 #define IDirectInputDevice_GetProperty(p,a,b) (p)->lpVtbl->GetProperty(p,a,b)
    366 #define IDirectInputDevice_SetProperty(p,a,b) (p)->lpVtbl->SetProperty(p,a,b)
    367 #define IDirectInputDevice_Acquire(p) (p)->lpVtbl->Acquire(p)
    368 #define IDirectInputDevice_Unacquire(p) (p)->lpVtbl->Unacquire(p)
    369 #define IDirectInputDevice_GetDeviceState(p,a,b) (p)->lpVtbl->GetDeviceState(p,a,b)
    370 #define IDirectInputDevice_GetDeviceData(p,a,b,c,d) (p)->lpVtbl->GetDeviceData(p,a,b,c,d)
    371 #define IDirectInputDevice_SetDataFormat(p,a) (p)->lpVtbl->SetDataFormat(p,a)
    372 #define IDirectInputDevice_SetEventNotification(p,a) (p)->lpVtbl->SetEventNotification(p,a)
    373 #define IDirectInputDevice_SetCooperativeLevel(p,a,b) (p)->lpVtbl->SetCooperativeLevel(p,a,b)
    374 #define IDirectInputDevice_GetObjectInfo(p,a,b,c) (p)->lpVtbl->GetObjectInfo(p,a,b,c)
    375 #define IDirectInputDevice_GetDeviceInfo(p,a) (p)->lpVtbl->GetDeviceInfo(p,a)
    376 #define IDirectInputDevice_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
    377 #define IDirectInputDevice_Initialize(p,a,b,c) (p)->lpVtbl->Initialize(p,a,b,c)
    378 #endif
    379 
    380 /****************************************************************************
    381  *
    382  *      Mouse
    383  *
    384  ****************************************************************************/
    385 
    386 typedef struct _DIMOUSESTATE {
    387     LONG    lX;
    388     LONG    lY;
    389     LONG    lZ;
    390     BYTE    rgbButtons[4];
    391 } DIMOUSESTATE, *LPDIMOUSESTATE;
    392 
    393 #define DIMOFS_X        FIELD_OFFSET(DIMOUSESTATE, lX)
    394 #define DIMOFS_Y        FIELD_OFFSET(DIMOUSESTATE, lY)
    395 #define DIMOFS_Z        FIELD_OFFSET(DIMOUSESTATE, lZ)
    396 #define DIMOFS_BUTTON0 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 0)
    397 #define DIMOFS_BUTTON1 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 1)
    398 #define DIMOFS_BUTTON2 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 2)
    399 #define DIMOFS_BUTTON3 (FIELD_OFFSET(DIMOUSESTATE, rgbButtons) + 3)
    400 
    401 /****************************************************************************
    402  *
    403  *      Keyboard
    404  *
    405  ****************************************************************************/
    406 
    407 /****************************************************************************
    408  *
    409  *      DirectInput keyboard scan codes
    410  *
    411  ****************************************************************************/
    412 
    413 #define DIK_ESCAPE          0x01
    414 #define DIK_1               0x02
    415 #define DIK_2               0x03
    416 #define DIK_3               0x04
    417 #define DIK_4               0x05
    418 #define DIK_5               0x06
    419 #define DIK_6               0x07
    420 #define DIK_7               0x08
    421 #define DIK_8               0x09
    422 #define DIK_9               0x0A
    423 #define DIK_0               0x0B
    424 #define DIK_MINUS           0x0C    /* - on main keyboard */
    425 #define DIK_EQUALS          0x0D
    426 #define DIK_BACK            0x0E    /* backspace */
    427 #define DIK_TAB             0x0F
    428 #define DIK_Q               0x10
    429 #define DIK_W               0x11
    430 #define DIK_E               0x12
    431 #define DIK_R               0x13
    432 #define DIK_T               0x14
    433 #define DIK_Y               0x15
    434 #define DIK_U               0x16
    435 #define DIK_I               0x17
    436 #define DIK_O               0x18
    437 #define DIK_P               0x19
    438 #define DIK_LBRACKET        0x1A
    439 #define DIK_RBRACKET        0x1B
    440 #define DIK_RETURN          0x1C    /* Enter on main keyboard */
    441 #define DIK_LCONTROL        0x1D
    442 #define DIK_A               0x1E
    443 #define DIK_S               0x1F
    444 #define DIK_D               0x20
    445 #define DIK_F               0x21
    446 #define DIK_G               0x22
    447 #define DIK_H               0x23
    448 #define DIK_J               0x24
    449 #define DIK_K               0x25
    450 #define DIK_L               0x26
    451 #define DIK_SEMICOLON       0x27
    452 #define DIK_APOSTROPHE      0x28
    453 #define DIK_GRAVE           0x29    /* accent grave */
    454 #define DIK_LSHIFT          0x2A
    455 #define DIK_BACKSLASH       0x2B
    456 #define DIK_Z               0x2C
    457 #define DIK_X               0x2D
    458 #define DIK_C               0x2E
    459 #define DIK_V               0x2F
    460 #define DIK_B               0x30
    461 #define DIK_N               0x31
    462 #define DIK_M               0x32
    463 #define DIK_COMMA           0x33
    464 #define DIK_PERIOD          0x34    /* . on main keyboard */
    465 #define DIK_SLASH           0x35    /* / on main keyboard */
    466 #define DIK_RSHIFT          0x36
    467 #define DIK_MULTIPLY        0x37    /* * on numeric keypad */
    468 #define DIK_LMENU           0x38    /* left Alt */
    469 #define DIK_SPACE           0x39
    470 #define DIK_CAPITAL         0x3A
    471 #define DIK_F1              0x3B
    472 #define DIK_F2              0x3C
    473 #define DIK_F3              0x3D
    474 #define DIK_F4              0x3E
    475 #define DIK_F5              0x3F
    476 #define DIK_F6              0x40
    477 #define DIK_F7              0x41
    478 #define DIK_F8              0x42
    479 #define DIK_F9              0x43
    480 #define DIK_F10             0x44
    481 #define DIK_NUMLOCK         0x45
    482 #define DIK_SCROLL          0x46    /* Scroll Lock */
    483 #define DIK_NUMPAD7         0x47
    484 #define DIK_NUMPAD8         0x48
    485 #define DIK_NUMPAD9         0x49
    486 #define DIK_SUBTRACT        0x4A    /* - on numeric keypad */
    487 #define DIK_NUMPAD4         0x4B
    488 #define DIK_NUMPAD5         0x4C
    489 #define DIK_NUMPAD6         0x4D
    490 #define DIK_ADD             0x4E    /* + on numeric keypad */
    491 #define DIK_NUMPAD1         0x4F
    492 #define DIK_NUMPAD2         0x50
    493 #define DIK_NUMPAD3         0x51
    494 #define DIK_NUMPAD0         0x52
    495 #define DIK_DECIMAL         0x53    /* . on numeric keypad */
    496 #define DIK_F11             0x57
    497 #define DIK_F12             0x58
    498 
    499 #define DIK_F13             0x64    /*                     (NEC PC98) */
    500 #define DIK_F14             0x65    /*                     (NEC PC98) */
    501 #define DIK_F15             0x66    /*                     (NEC PC98) */
    502 
    503 #define DIK_KANA            0x70    /* (Japanese keyboard)            */
    504 #define DIK_CONVERT         0x79    /* (Japanese keyboard)            */
    505 #define DIK_NOCONVERT       0x7B    /* (Japanese keyboard)            */
    506 #define DIK_YEN             0x7D    /* (Japanese keyboard)            */
    507 #define DIK_NUMPADEQUALS    0x8D    /* = on numeric keypad (NEC PC98) */
    508 #define DIK_CIRCUMFLEX      0x90    /* (Japanese keyboard)            */
    509 #define DIK_AT              0x91    /*                     (NEC PC98) */
    510 #define DIK_COLON           0x92    /*                     (NEC PC98) */
    511 #define DIK_UNDERLINE       0x93    /*                     (NEC PC98) */
    512 #define DIK_KANJI           0x94    /* (Japanese keyboard)            */
    513 #define DIK_STOP            0x95    /*                     (NEC PC98) */
    514 #define DIK_AX              0x96    /*                     (Japan AX) */
    515 #define DIK_UNLABELED       0x97    /*                        (J3100) */
    516 #define DIK_NUMPADENTER     0x9C    /* Enter on numeric keypad */
    517 #define DIK_RCONTROL        0x9D
    518 #define DIK_NUMPADCOMMA     0xB3    /* , on numeric keypad (NEC PC98) */
    519 #define DIK_DIVIDE          0xB5    /* / on numeric keypad */
    520 #define DIK_SYSRQ           0xB7
    521 #define DIK_RMENU           0xB8    /* right Alt */
    522 #define DIK_HOME            0xC7    /* Home on arrow keypad */
    523 #define DIK_UP              0xC8    /* UpArrow on arrow keypad */
    524 #define DIK_PRIOR           0xC9    /* PgUp on arrow keypad */
    525 #define DIK_LEFT            0xCB    /* LeftArrow on arrow keypad */
    526 #define DIK_RIGHT           0xCD    /* RightArrow on arrow keypad */
    527 #define DIK_END             0xCF    /* End on arrow keypad */
    528 #define DIK_DOWN            0xD0    /* DownArrow on arrow keypad */
    529 #define DIK_NEXT            0xD1    /* PgDn on arrow keypad */
    530 #define DIK_INSERT          0xD2    /* Insert on arrow keypad */
    531 #define DIK_DELETE          0xD3    /* Delete on arrow keypad */
    532 #define DIK_LWIN            0xDB    /* Left Windows key */
    533 #define DIK_RWIN            0xDC    /* Right Windows key */
    534 #define DIK_APPS            0xDD    /* AppMenu key */
    535 
    536 /*
    537  *  Alternate names for keys, to facilitate transition from DOS.
    538  */
    539 #define DIK_BACKSPACE       DIK_BACK            /* backspace */
    540 #define DIK_NUMPADSTAR      DIK_MULTIPLY        /* * on numeric keypad */
    541 #define DIK_LALT            DIK_LMENU           /* left Alt */
    542 #define DIK_CAPSLOCK        DIK_CAPITAL         /* CapsLock */
    543 #define DIK_NUMPADMINUS     DIK_SUBTRACT        /* - on numeric keypad */
    544 #define DIK_NUMPADPLUS      DIK_ADD             /* + on numeric keypad */
    545 #define DIK_NUMPADPERIOD    DIK_DECIMAL         /* . on numeric keypad */
    546 #define DIK_NUMPADSLASH     DIK_DIVIDE          /* / on numeric keypad */
    547 #define DIK_RALT            DIK_RMENU           /* right Alt */
    548 #define DIK_UPARROW         DIK_UP              /* UpArrow on arrow keypad */
    549 #define DIK_PGUP            DIK_PRIOR           /* PgUp on arrow keypad */
    550 #define DIK_LEFTARROW       DIK_LEFT            /* LeftArrow on arrow keypad */
    551 #define DIK_RIGHTARROW      DIK_RIGHT           /* RightArrow on arrow keypad */
    552 #define DIK_DOWNARROW       DIK_DOWN            /* DownArrow on arrow keypad */
    553 #define DIK_PGDN            DIK_NEXT            /* PgDn on arrow keypad */
    554 
    555 /****************************************************************************
    556  *
    557  *  IDirectInput
    558  *
    559  ****************************************************************************/
    560 
    561 #define DIENUM_STOP             0
    562 #define DIENUM_CONTINUE         1
    563 
    564 typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA, LPVOID);
    565 typedef BOOL (FAR PASCAL * LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW, LPVOID);
    566 #ifdef UNICODE
    567 #define LPDIENUMDEVICESCALLBACK  LPDIENUMDEVICESCALLBACKW
    568 #else
    569 #define LPDIENUMDEVICESCALLBACK  LPDIENUMDEVICESCALLBACKA
    570 #endif // !UNICODE
    571 
    572 #define DIEDFL_ALLDEVICES       0x00000000
    573 #define DIEDFL_ATTACHEDONLY     0x00000001
    574 
    575 #undef INTERFACE
    576 #define INTERFACE IDirectInputW
    577 
    578 DECLARE_INTERFACE_(IDirectInputW, IUnknown)
    579 {
    580     /*** IUnknown methods ***/
    581     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
    582     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    583     STDMETHOD_(ULONG,Release)(THIS) PURE;
    584 
    585     /*** IDirectInputW methods ***/
    586     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEW *,LPUNKNOWN) PURE;
    587     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKW,LPVOID,DWORD) PURE;
    588     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
    589     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
    590     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
    591 };
    592 
    593 typedef struct IDirectInputW *LPDIRECTINPUTW;
    594 
    595 #undef INTERFACE
    596 #define INTERFACE IDirectInputA
    597 
    598 DECLARE_INTERFACE_(IDirectInputA, IUnknown)
    599 {
    600     /*** IUnknown methods ***/
    601     STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE;
    602     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
    603     STDMETHOD_(ULONG,Release)(THIS) PURE;
    604 
    605     /*** IDirectInputA methods ***/
    606     STDMETHOD(CreateDevice)(THIS_ REFGUID,LPDIRECTINPUTDEVICEA *,LPUNKNOWN) PURE;
    607     STDMETHOD(EnumDevices)(THIS_ DWORD,LPDIENUMDEVICESCALLBACKA,LPVOID,DWORD) PURE;
    608     STDMETHOD(GetDeviceStatus)(THIS_ REFGUID) PURE;
    609     STDMETHOD(RunControlPanel)(THIS_ HWND,DWORD) PURE;
    610     STDMETHOD(Initialize)(THIS_ HINSTANCE,DWORD) PURE;
    611 };
    612 
    613 typedef struct IDirectInputA *LPDIRECTINPUTA;
    614 
    615 #ifdef UNICODE
    616 #define IID_IDirectInput IID_IDirectInputW
    617 #define IDirectInput IDirectInputW
    618 #define IDirectInputVtbl IDirectInputWVtbl
    619 #else
    620 #define IID_IDirectInput IID_IDirectInputA
    621 #define IDirectInput IDirectInputA
    622 #define IDirectInputVtbl IDirectInputAVtbl
    623 #endif
    624 typedef struct IDirectInput *LPDIRECTINPUT;
    625 
    626 #if !defined(__cplusplus) || defined(CINTERFACE)
    627 #define IDirectInput_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
    628 #define IDirectInput_AddRef(p) (p)->lpVtbl->AddRef(p)
    629 #define IDirectInput_Release(p) (p)->lpVtbl->Release(p)
    630 #define IDirectInput_CreateDevice(p,a,b,c) (p)->lpVtbl->CreateDevice(p,a,b,c)
    631 #define IDirectInput_EnumDevices(p,a,b,c,d) (p)->lpVtbl->EnumDevices(p,a,b,c,d)
    632 #define IDirectInput_GetDeviceStatus(p,a) (p)->lpVtbl->GetDeviceStatus(p,a)
    633 #define IDirectInput_RunControlPanel(p,a,b) (p)->lpVtbl->RunControlPanel(p,a,b)
    634 #define IDirectInput_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b)
    635 #endif
    636 
    637 extern HRESULT WINAPI DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter);
    638 extern HRESULT WINAPI DirectInputCreateW(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTW *ppDI, LPUNKNOWN punkOuter);
    639 #ifdef UNICODE
    640 #define DirectInputCreate  DirectInputCreateW
    641 #else
    642 #define DirectInputCreate  DirectInputCreateA
    643 #endif // !UNICODE
    644 
    645 /****************************************************************************
    646  *
    647  *  Return Codes
    648  *
    649  ****************************************************************************/
    650 
    651 /*
    652  *  The operation completed successfully.
    653  */
    654 #define DI_OK                           S_OK
    655 
    656 /*
    657  *  The device exists but is not currently attached.
    658  */
    659 #define DI_NOTATTACHED                  S_FALSE
    660 
    661 /*
    662  *  The device buffer overflowed; some input was lost.
    663  */
    664 #define DI_BUFFEROVERFLOW               S_FALSE
    665 
    666 /*
    667  *  The change in device properties had no effect.
    668  */
    669 #define DI_PROPNOEFFECT                 S_FALSE
    670 
    671 /*
    672  *  The device is a polled device.  As a result, device buffering
    673  *  will not collect any data and event notifications will not be
    674  *  signalled until GetDeviceState is called.
    675  */
    676 #define DI_POLLEDDEVICE                 ((HRESULT)0x00000002L)
    677 
    678 /*
    679  *  The application requires a newer version of DirectInput.
    680  */
    681 #define DIERR_OLDDIRECTINPUTVERSION     \
    682     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_OLD_WIN_VERSION)
    683 
    684 /*
    685  *  The application was written for an unsupported prerelease version
    686  *  of DirectInput.
    687  */
    688 #define DIERR_BETADIRECTINPUTVERSION    \
    689     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_RMODE_APP)
    690 
    691 /*
    692  *  The object could not be created due to an incompatible driver version
    693  *  or mismatched or incomplete driver components.
    694  */
    695 #define DIERR_BADDRIVERVER              \
    696     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BAD_DRIVER_LEVEL)
    697 
    698 /*
    699  * The device or device instance is not registered with DirectInput.
    700  */
    701 #define DIERR_DEVICENOTREG              REGDB_E_CLASSNOTREG
    702 
    703 /*
    704  * The requested object does not exist.
    705  */
    706 #define DIERR_OBJECTNOTFOUND            \
    707     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND)
    708 
    709 /*
    710  * An invalid parameter was passed to the returning function,
    711  * or the object was not in a state that admitted the function
    712  * to be called.
    713  */
    714 #define DIERR_INVALIDPARAM              E_INVALIDARG
    715 
    716 /*
    717  * The specified interface is not supported by the object
    718  */
    719 #define DIERR_NOINTERFACE               E_NOINTERFACE
    720 
    721 /*
    722  * An undetermined error occured inside the DInput subsystem
    723  */
    724 #define DIERR_GENERIC                   E_FAIL
    725 
    726 /*
    727  * The DInput subsystem couldn't allocate sufficient memory to complete the
    728  * caller's request.
    729  */
    730 #define DIERR_OUTOFMEMORY               E_OUTOFMEMORY
    731 
    732 /*
    733  * The function called is not supported at this time
    734  */
    735 #define DIERR_UNSUPPORTED               E_NOTIMPL
    736 
    737 /*
    738  * This object has not been initialized
    739  */
    740 #define DIERR_NOTINITIALIZED            \
    741     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_READY)
    742 
    743 /*
    744  * This object is already initialized
    745  */
    746 #define DIERR_ALREADYINITIALIZED        \
    747     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_INITIALIZED)
    748 
    749 /*
    750  * This object does not support aggregation
    751  */
    752 #define DIERR_NOAGGREGATION             CLASS_E_NOAGGREGATION
    753 
    754 /*
    755  * Another app has a higher priority level, preventing this call from
    756  * succeeding.
    757  */
    758 #define DIERR_OTHERAPPHASPRIO           E_ACCESSDENIED
    759 
    760 /*
    761  * Access to the input device has been lost.  It must be re-acquired.
    762  */
    763 #define DIERR_INPUTLOST                 \
    764     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_READ_FAULT)
    765 
    766 /*
    767  * The operation cannot be performed while the device is acquired.
    768  */
    769 #define DIERR_ACQUIRED                  \
    770     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_BUSY)
    771 
    772 /*
    773  * The operation cannot be performed unless the device is acquired.
    774  */
    775 #define DIERR_NOTACQUIRED               \
    776     MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INVALID_ACCESS)
    777 
    778 /*
    779  * The specified property cannot be changed.
    780  */
    781 #define DIERR_READONLY                  E_ACCESSDENIED
    782 
    783 /*
    784  * The device already has an event notification associated with it.
    785  */
    786 #define DIERR_HANDLEEXISTS              E_ACCESSDENIED
    787 
    788 /*
    789  * Data is not yet available.
    790  */
    791 #ifndef E_PENDING
    792 #define E_PENDING                       0x80070007L
    793 #endif
    794 
    795 #ifdef __cplusplus
    796 };
    797 #endif
    798 
    799 #endif  /* __DINPUT_INCLUDED__ */
    800 
    801 /****************************************************************************
    802  *
    803  *  Definitions for non-IDirectInput (VJoyD) features defined more recently
    804  *  than the current sdk files
    805  *
    806  ****************************************************************************/
    807 
    808 #ifdef _INC_MMSYSTEM
    809 #ifndef MMNOJOY
    810 
    811 #ifndef __VJOYDX_INCLUDED__
    812 #define __VJOYDX_INCLUDED__
    813 
    814 #ifdef __cplusplus
    815 extern "C" {
    816 #endif
    817 
    818 /*
    819  * Flag to indicate that the dwReserved2 field of the JOYINFOEX structure
    820  * contains mini-driver specific data to be passed by VJoyD to the mini-
    821  * driver instead of doing a poll.
    822  */
    823 #define JOY_PASSDRIVERDATA          0x10000000l
    824 
    825 /*
    826  * Informs the joystick driver that the configuration has been changed
    827  * and should be reloaded from the registery.
    828  * dwFlags is reserved and should be set to zero
    829  */
    830 WINMMAPI MMRESULT WINAPI joyConfigChanged( DWORD dwFlags );
    831 
    832 /*
    833  * Hardware Setting indicating that the device is a headtracker
    834  */
    835 #define JOY_HWS_ISHEADTRACKER       0x02000000l
    836 
    837 /*
    838  * Hardware Setting indicating that the VxD is used to replace
    839  * the standard analog polling
    840  */
    841 #define JOY_HWS_ISGAMEPORTDRIVER    0x04000000l
    842 
    843 #ifdef __cplusplus
    844 };
    845 #endif
    846 
    847 #endif  /* __VJOYDX_INCLUDED__ */
    848 
    849 #endif  /* not MMNOJOY */
    850 #endif  /* _INC_MMSYSTEM */
    851 
    852 /****************************************************************************
    853  *
    854  *  Definitions for non-IDirectInput (VJoyD) features defined more recently
    855  *  than the current ddk files
    856  *
    857  ****************************************************************************/
    858 
    859 #ifdef _INC_MMDDK
    860 #ifndef MMNOJOYDEV
    861 
    862 #ifndef __VJOYDXD_INCLUDED__
    863 #define __VJOYDXD_INCLUDED__
    864 /*
    865  * Poll type in which the do_other field of the JOYOEMPOLLDATA
    866  * structure contains mini-driver specific data passed from an app.
    867  */
    868 #define JOY_OEMPOLL_PASSDRIVERDATA  7
    869 
    870 #endif  /* __VJOYDXD_INCLUDED__ */
    871 
    872 #endif  /* not MMNOJOYDEV */
    873 #endif  /* _INC_MMDDK */
    874