Sign in to follow this  

Need help with DirectInput

This topic is 1830 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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?

 

Share this post


Link to post
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?

Share this post


Link to post
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).

Share this post


Link to post
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).

Share this post


Link to post
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

Share this post


Link to post
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?

Share this post


Link to post
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.
Xbox360 compatible gamepads - XInput.
All other joysticks, gamepads, wheels etc - DirectInput. Edited by Tom KQT

Share this post


Link to post
Share on other sites
Sign in to follow this