Followers 0

# Need help with DirectInput

## 8 posts in this topic

I am trying to use DirectInput but I can't see why my code crashes. I checked directx sdk and some online sources for reference. Turns out I do the same thing as tutorials but it still doesn't work.

LPDIRECTINPUTDEVICE8 DIKeyboard;
LPDIRECTINPUTDEVICE8 DIMouse;
DIMOUSESTATE mouseLastState;
LPDIRECTINPUT8 DirectInput;

HRESULT hr;
HINSTANCE hInst;
HWND hwnd;

bool InitInput()
{
hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8,
(void**)&DirectInput,
NULL);

DirectInput->CreateDevice(GUID_SysKeyboard, &DIKeyboard, NULL);
DirectInput->CreateDevice(GUID_SysMouse, &DIMouse, NULL);

DIKeyboard->SetDataFormat(&c_dfDIKeyboard);
DIKeyboard->SetCooperativeLevel(hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);

DIMouse->SetDataFormat(&c_dfDIMouse);
DIMouse->SetCooperativeLevel(hwnd, DISCL_EXCLUSIVE | DISCL_NOWINKEY | DISCL_FOREGROUND);

return true;
}

void CheckInput()
{
DIMOUSESTATE mouseCurrState;

BYTE keyboardState[256];

DIKeyboard->Acquire();
DIMouse->Acquire();

DIKeyboard->GetDeviceState(sizeof(keyboardState),(LPVOID)&keyboardState);
DIMouse->GetDeviceState(sizeof(DIMOUSESTATE), &mouseCurrState);

//if(keyboardState[DIK_ESCAPE] & 0x80)
//	PostMessage(hwnd, WM_DESTROY, 0, 0);

//float speed = 10.0f * time;

if(keyboardState[DIK_UP] & 0x80)
RotationAngle += 1.0f;

if(keyboardState[DIK_DOWN] & 0x80)
RotationAngle -= 1.0f;

if((mouseCurrState.lX != mouseLastState.lX) || (mouseCurrState.lY != mouseLastState.lY))
{
//camYaw += mouseLastState.lX * 0.001f;
//camPitch += mouseCurrState.lY * 0.001f;

mouseLastState = mouseCurrState;
}
}

void ReleaseInput()
{
DIKeyboard->Unacquire();
DIMouse->Unacquire();
DirectInput->Release();
}


I use InitInput() after I create a window with SDL. I don't want to use SDL for input.

When I debug the program I am getting the crash at

DirectInput->CreateDevice(GUID_SysKeyboard, &DIKeyboard, NULL);

with E_INVALIDARG.

Why Is this this doesn't appear to be the problem in other appliactions that are using DirectInput?

0

##### Share on other sites

What is the HRESULT (hr) of DirectInput8Create()?

Have you ever set the value of 'hInst'?

0

##### Share on other sites

I didn't set 'hInst' or 'hwnd' but even if I pass NULL it doesn't work. Also HR returns S_OK in both cases. Any ideas?

0

##### Share on other sites

hInst should be the instance handle of the application that creates the DirectInput object. It's the HINSTANCE argument you get from WinMain() (or from DllMain() when you're creating a dll).

1

##### Share on other sites

Ok, thanks I fixed it.

Just one more thing in

keyboardState[DIK_UP] & 0x80

what does & 0x80 mean? I can't find any info on this (the code work even without it).

0

##### Share on other sites
0x80 is the high bit of an 8 bit integer (10000000).

If you AND '&' this value with one of the elements in the keyboardState array the resulting value is 0x80 as well in case the key is down.

If this bit is the only bit used, simply checking whether keyboardState is non-zero should work as well, but don't rely on this as other bits may be used for other purposes. Edited by eppo
1

##### Share on other sites

DirectInput is depreciated, you should handle input through Windows message loop or GetAsyncKeyState() instead.

1

##### Share on other sites

DirectInput is the only thing that has remained dx8 in entire dx sdk and is not reported as depreciated by compiler. There is XInput and XInput2 but if I understand this correctly it is only for gamepad/joystick support.

GetAsyncKeyState() is not directx, and I am concerned it may act differently for non US keyboards is this true?

0

##### Share on other sites
Yep, DirectInput isn't oficially depreciated. But Microsoft doesn't recommend it for keyboard and mouse input (I could find the source if you wanted, but I don't think it's so important to give proofs to this as it still was just a recommendation from them, not a directive). The recommended ("official") way to handle input is like this:

Keyboard & mouse - Windows messages.
All other joysticks, gamepads, wheels etc - DirectInput. Edited by Tom KQT
0

## Create an account

Register a new account