Jump to content

  • Log In with Google      Sign In   
  • Create Account


Need help with DirectInput


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
8 replies to this topic

#1 proanim   Members   -  Reputation: 437

Like
0Likes
Like

Posted 12 January 2013 - 09:30 AM

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?

 



Sponsor:

#2 eppo   Crossbones+   -  Reputation: 2312

Like
0Likes
Like

Posted 12 January 2013 - 11:57 AM

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

 

Have you ever set the value of 'hInst'?



#3 proanim   Members   -  Reputation: 437

Like
0Likes
Like

Posted 12 January 2013 - 12:08 PM

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?



#4 eppo   Crossbones+   -  Reputation: 2312

Like
1Likes
Like

Posted 12 January 2013 - 01:33 PM

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



#5 proanim   Members   -  Reputation: 437

Like
0Likes
Like

Posted 12 January 2013 - 02:03 PM

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



#6 eppo   Crossbones+   -  Reputation: 2312

Like
1Likes
Like

Posted 12 January 2013 - 02:35 PM

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, 12 January 2013 - 02:40 PM.


#7 Medo3337   Members   -  Reputation: 665

Like
1Likes
Like

Posted 12 January 2013 - 04:48 PM

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



#8 proanim   Members   -  Reputation: 437

Like
0Likes
Like

Posted 12 January 2013 - 08:06 PM

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?



#9 Tom KQT   Members   -  Reputation: 1506

Like
0Likes
Like

Posted 13 January 2013 - 07:12 AM

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, 13 January 2013 - 07:13 AM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS