Need help with DirectInput

Started by
7 comments, last by TomKQT 11 years, 3 months ago

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?

Advertisement

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

Have you ever set the value of 'hInst'?

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?

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).

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).

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.

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

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?

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.

This topic is closed to new replies.

Advertisement