This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

| DirectInput Example Submitted by

This code provides both immediate and buffered keyboard input as well as mouse input. The "keyboard" array can be used as follows: if (keyboard[23]) then some action. The number 23 stands for the scan code of the key pressed/held down. (The scan codes are defined in the dinput.h file that comes with the DirectX SDK.) The "keyevent" array can be used as follows: if (keyevent[3] == true) { keyevent[3] = false; some action associated with key press }. You can look over the sample code that comes with the help files of the SDK for more detailed information on how DirectInput works.

Download Associated File: DirectInput.cpp (2,930 bytes)

    #include "winmain.h"
    #include "dinput.h"

    LPDIRECTINPUT		 lpDInput		= NULL;	// pointer to direct input object
    LPDIRECTINPUTDEVICE	 lpDIKeyboard	= NULL;	// pointer to keyboard device
    LPDIRECTINPUTDEVICE	 lpDIMouse		= NULL;	// pointer to mouse device
    char				 keyboard[144];			// contains state of keyboard
    bool				 keyevent[144];			// scan code of a pressed key
    DIMOUSESTATE		 MouseState;			// contains state of mouse
    float				 mouse_x;
    float				 mouse_y;

    #define KEYBOARD_BUFFER_SIZE 1	// number of events in buffer

    //==============================================
    //	InitDInput()
    //==============================================

    int InitDInput(HWND hWnd, HINSTANCE hInstance)

    {

    	if (DirectInputCreate(hInstance, DIRECTINPUT_VERSION, &lpDInput, NULL) != DI_OK)
    	{
    	}

    	//--------------------
    	// Keyboard
    	//--------------------

    	if (lpDInput->CreateDevice(GUID_SysKeyboard, &lpDIKeyboard, NULL) != DI_OK)
    	{
    	}

    	if (lpDIKeyboard->SetDataFormat(&c_dfDIKeyboard) != DI_OK)
    	{
    	}

    	if (lpDIKeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND) != DI_OK)
    	{
    	}

    	DIPROPDWORD dipdw;
    	dipdw.diph.dwSize = sizeof(DIPROPDWORD);
    	dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
    	dipdw.diph.dwObj = 0;
    	dipdw.diph.dwHow = DIPH_DEVICE;
    	dipdw.dwData = KEYBOARD_BUFFER_SIZE;

    	if (lpDIKeyboard->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph) != DI_OK)
    	{
    	}

    	if (lpDIKeyboard->Acquire() != DI_OK)
    	{
    	}

    	//--------------------
    	// Mouse
    	//--------------------

    	if (lpDInput->CreateDevice(GUID_SysMouse, &lpDIMouse, NULL) != DI_OK)
    	{
    	}

    	if (lpDIMouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND) != DI_OK)
    	{
    	}

    	if (lpDIMouse->SetDataFormat(&c_dfDIMouse) != DI_OK)
    	{
    	}

    	if (lpDIMouse->Acquire() != DI_OK)
    	{
    	}

    return(0);
    }

    //==============================================
    //	GetDInput()
    //==============================================

    int GetDInput()
    {
    	if(lpDIKeyboard->GetDeviceState(256, (LPVOID)keyboard) != DI_OK)
    	{
    	}

    	if(lpDIMouse->GetDeviceState(sizeof(DIMOUSESTATE), (LPVOID)&MouseState) != DI_OK)
    	{
    	}

    	mouse_x = MouseState.lX;
    	mouse_y = MouseState.lY;

    	DIDEVICEOBJECTDATA key_pressed[KEYBOARD_BUFFER_SIZE];
    	DWORD dwItems;
    	HRESULT hRes = DIERR_INPUTLOST;

    	while (DI_OK != hRes)
        {
    		hRes = lpDIKeyboard->GetDeviceData(sizeof(DIDEVICEOBJECTDATA), key_pressed, &dwItems, 0);
    		if (hRes != DI_OK)
    		{
    			lpDIKeyboard->Acquire();
    		}
    	}
    	if ((key_pressed[0].dwData & 0x80) ? 1 : 0) // only key-down events are reported
    	{
    		keyevent[key_pressed[0].dwOfs] = true;
    	}

    return(0);
    }

    //==============================================
    //	ReleaseDInput()
    //==============================================

    int ReleaseDInput()
    {
    	if (lpDInput != NULL)
    	{
    		lpDInput->Release();
    	}

    	if (lpDIKeyboard != NULL)
    	{
    		lpDIKeyboard->Unacquire();
    		lpDIKeyboard->Release();
    	}

    	if (lpDIMouse != NULL)
    	{
    		lpDIMouse->Unacquire();
    		lpDIMouse->Release();
    	}

    return(0);
    }

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.