Hi guys,
Hope you guys can give me assistance with this little 'DirectInput' problem I am having.
Basically in my code when I try to Acquire() my keyboard device it is returning a 'FAILED' result and I am not sure why.
//------------- MAIN APPLICATION ENTRY POINT -------------//
... //Some include code omitted.
... //Some define code omitted.
IDirect3DDevice9 *D3DDevice = NULL;
IDirect3DVertexBuffer9 *VertexBuffer = NULL;
BaseWindow *baseWindow;
Equipment **equipment = new Equipment *[ EQUIPMENT_SIZE ];
int equipSize = Equipment::getCount();
Spacecraft **spaceship = new Spacecraft *[ AIRCRAFT_SIZE ];
PlayerControl *player;
Direct3DInput *direct3DInput;
struct CustomVertex
{
FLOAT x, y, z;
DWORD color;
};
void RandomNumGen::seedRandom();
//--- Function Prototypes ---//
void cleanUp();
void initStars();
void gameLoop();
void renderGame();
void setupGame();
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
baseWindow = new BaseWindow;
baseWindow->registerWindowClass();
baseWindow->createWindow();
Direct3DUtility::init3D( hInstance, baseWindow->getHandle(), &D3DDevice );
Direct3DUtility::initState( &D3DDevice );
Direct3DUtility::initDirLight( &D3DDevice, Direct3DUtility::COLOR_WHITE );
Direct3DUtility::initCamera( &D3DDevice );
direct3DInput = new Direct3DInput;
direct3DInput->initDirectInput( hInstance, baseWindow->getHandle() );
setupGame();
baseWindow->show();
MSG msg;
ZeroMemory( &msg, sizeof( MSG ));
while( msg.message != WM_QUIT )
{
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
renderGame();
Yield();
}
}
UnregisterClass( baseWindow->getClassName(), hInstance );
return 0;
}
void setupGame()
{
... //code omitted.
}
void renderGame()
{
... //code omitted.
}
void initStars()
{
... //code omitted.
}
void cleanUp()
{
// Releases resources (eg. memory, DirectX objects).
... //code omitted
}
// ---------- Direct3DInput.h file ------------//
#ifndef DIRECT3DINPUT_H
#define DIRECT3DINPUT_H
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h>
#define KEY_SIZE 256
class Direct3DInput
{
public:
Direct3DInput();
void initDirectInput( HINSTANCE hInstance, HWND hWnd );
bool keyDown( int key );
private:
IDirectInput8 *inputSystem;
IDirectInputDevice8 *keyboard;
char keys[ KEY_SIZE ];
};
#endif
// ---------- Direct3DInput.cpp file -----------//
#include "Direct3DInput.h"
Direct3DInput::Direct3DInput()
{
inputSystem = NULL;
keyboard = NULL;
}
void Direct3DInput::initDirectInput( HINSTANCE hInstance, HWND hWnd )
{
if( FAILED( DirectInput8Create( hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, ( void ** ) &inputSystem, NULL )))
{
MessageBox( 0, "Direct3DInput::initDirectInput() 1", 0, MB_OK );
}
if( FAILED( inputSystem->CreateDevice( GUID_SysKeyboard, &keyboard, NULL )))
{
MessageBox( 0, "Direct3DInput::initDirectInput() 2", 0, MB_OK );
}
if( FAILED( keyboard->SetDataFormat( &c_dfDIKeyboard )))
{
MessageBox( 0, "Direct3DInput::initDirectInput() 3", 0, MB_OK );
}
if( FAILED( keyboard->SetCooperativeLevel( hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE )))
{
MessageBox( 0, "Direct3DInput::initDirectInput() 4", 0, MB_OK );
}
if( FAILED( keyboard->Acquire() ))
{
// When it gets to this part... it fails and hence goes into 'if' body.
MessageBox( 0, "Direct3DInput::initDirectInput() 5", 0, MB_OK );
}
ZeroMemory(keys, KEY_SIZE * sizeof( char ));
}
... //other function omitted.
I even try catching the error values DIERR_INVALIDPARAM, DIERR_NOTINITIALIZED and DIERR_OTHERAPPHASPRIO but these are not the errors that is being returned.
Let me show you what I mean...
if( FAILED( keyboard->Acquire() ))
{
if( S_FALSE == DIERR_NOTINITIALIZED )
{
MessageBox( 0, "Direct3DInput::initDirectInput() 5", 0, MB_OK );
}
}
But when I do the above... it doesn't go into the 2nd if at all, even if I change the error value to one of the other ones, the 2nd 'if' doesn't catch it.
So I don't really know why I can't acquire my keyboard.
Any help is really appreciated :-D
P.S. Some will tell me not to use DirectInput anymore... and I've read some post about it. In the near future I will properly research and get a more in depth understanding of it all... but for now and my this case I've decided to stick with it.