• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
DECLARE_INTERFACE_(IDirectInputDeviceW,IUnknown)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 
DECLARE_INTERFACE_(IDirectInputDeviceA,IUnknown)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 
DECLARE_INTERFACE_(IDirectInputW,IUnknown)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 
DECLARE_INTERFACE_(IDirectInputA,IUnknown)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