-
Notifications
You must be signed in to change notification settings - Fork 17
/
directinput.cpp
75 lines (63 loc) · 2.13 KB
/
directinput.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#include <stdio.h>
struct Joysticks
{
unsigned int deviceCount;
IDirectInputDevice8** devices;
IDirectInput8* dinput;
};
BOOL CALLBACK DirectInputEnumDevicesCallback(LPCDIDEVICEINSTANCE instance, LPVOID userData)
{
Joysticks* joysticks = (Joysticks*)userData;
IDirectInputDevice8* device;
joysticks->dinput->CreateDevice(instance->guidInstance, &device, NULL);
device->SetCooperativeLevel(GetActiveWindow(), DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
device->SetDataFormat(&c_dfDIJoystick);
device->Acquire();
joysticks->deviceCount += 1;
joysticks->devices = (IDirectInputDevice8**)realloc(joysticks->devices, joysticks->deviceCount * sizeof(IDirectInputDevice8*));
joysticks->devices[joysticks->deviceCount - 1] = device;
return DIENUM_CONTINUE;
}
int main()
{
HINSTANCE hInstance = GetModuleHandle(0);
Joysticks joysticks = {0};
DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&joysticks.dinput, 0);
joysticks.dinput->EnumDevices(DI8DEVCLASS_GAMECTRL, DirectInputEnumDevicesCallback, (void*)&joysticks, DIEDFL_ALLDEVICES);
if (joysticks.deviceCount == 0) {
printf("No joysticks connected\n");
return 1;
}
while (1)
{
for (unsigned int joystickIndex=0; joystickIndex < joysticks.deviceCount; ++joystickIndex)
{
DIJOYSTATE state;
if (joysticks.devices[joystickIndex]->GetDeviceState(sizeof(state), &state) == DI_OK)
{
DIDEVCAPS caps = {sizeof(DIDEVCAPS)};
joysticks.devices[joystickIndex]->GetCapabilities(&caps);
printf("Joystick %d ", joystickIndex);
printf("X:%5d ", state.lX);
printf("Y:%5d ", state.lY);
printf("Z:%5d ", state.lZ);
printf("Rx:%5d ", state.lRx);
printf("Ry:%5d ", state.lRy);
printf("Rz:%5d ", state.lRz);
printf("Slider0:%5d ", state.rglSlider[0]);
printf("Slider1:%5d ", state.rglSlider[1]);
printf("Hat:%5d ", state.rgdwPOV[0]);
printf("Buttons: ");
for (unsigned int buttonIndex = 0; buttonIndex < caps.dwButtons; ++buttonIndex) {
if (state.rgbButtons[buttonIndex]) {
printf("%d ", buttonIndex);
}
}
printf("\n");
}
}
Sleep(16);
}
}