Return to Snippet

Revision: 41314
at February 16, 2011 02:48 by aday


Updated Code
---------------------------------- DirectInput.h -------------------------------------------

/* Esto se utilizar���¡ para poder manejar en cualquier programa los eventos de interacci���³n.
	Se han puesto en una clase aparte para obtener m���¡s portabilidad de este c���³digo.	*/

				/* By Aday Meli���¡n Carrillo for the common knowledge */

#define INITGUID
#define DIRECTINPUT_VERSION 0x0800 // Utilizaremos la versi���³n 8 de DirectInput
#include "dinput.h"
#include "Singleton.h"

// Definimos macros que nos ayuden a detectar las pulsaciones
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) 

// Mouse Buttons
#define MOUSE_LEFTBUTTON 0
#define MOUSE_RIGHTBUTTON 1
#define MOUSE_MIDDLEBUTTON 2
#define MOUSE_4BUTTON 3
#define MOUSE_5BUTTON 4
#define MOUSE_6BUTTON 5
#define MOUSE_7BUTTON 6
#define MOUSE_8BUTTON 7

// Necesitaremos incluir en el Linker las siguientes librer���­as situadas en el directorio de DirectX:
	//"dinput8.lib"
	//"dxguid.lib"

class ManejadorDirectInput: public Singleton<ManejadorDirectInput> {
private:
	// Variables Necesarias
	LPDIRECTINPUT8 din;    // Puntero a nuestra interfaz DirectInput
	// Teclado
	LPDIRECTINPUTDEVICE8 dinkeyboard;    // Puntero al dispositivo del teclado
	BYTE keystate[256];    // El almacenamiento de los estados de las teclas del teclado
	// Rat���³n
	LPDIRECTINPUTDEVICE8 dinmouse;    // Puntero al dispositivo de rat���³n
	DIMOUSESTATE mousestate;    // Almacenamiento de la informaci���³n del rat���³n
	POINT RatonPos;
public:
	void initDInput(HINSTANCE hInstance, HWND hWnd);    // Inicializamos DirectInput
	void detect_input(void);    // Obtenemos el estado actual de las entradas
	bool MousePressedButton(int Boton); // Obtenemos si el bot���³n pasado por par���¡metro est���¡ pulsado
	bool MouseReleasedButton(int Boton); // Obtenemos si el bot���³n pasado por par���¡metro est���¡ suelto
	POINT GetMousePosition(void); // Obtenemos la posici���³n absoluta actual del rat���³n
	void cleanDInput(void);    // Deinicializa DirectInput y libera la memoria
};

---------------------------------- DirectInput.cpp -----------------------------------------

#include "DirectInput.h"

// Inicializaci���³n de DirectInput
void ManejadorDirectInput::initDInput(HINSTANCE hInstance, HWND hWnd)
{
	// Creamos las interfaz DirectInput
	DirectInput8Create(hInstance,    // Manejador de la aplicaci���³n
					   DIRECTINPUT_VERSION,    // Versi���³n compatible
					   IID_IDirectInput8,    // Versi���³n de la interfaz de DirectInput
					   (void**)&din,    // El puntero a la interfaz
					   NULL);    // Opciones de COM, lo dejaremos a NULL
	dinmouse = NULL;
	dinkeyboard = NULL;
	// Creamos el dispositivo de Teclado
	din->CreateDevice(GUID_SysKeyboard,    // El ID del teclado por defecto que se est���¡ usando
					  &dinkeyboard,    // El puntero a la interfaz del dispositivo
					  NULL);    // Opciones de COM, lo dejaremos a NULL
	// Creamos el dispositivo del rat���³n
	din->CreateDevice(GUID_SysMouse,
                      &dinmouse,
                      NULL);

	// Asignamos el formato de datos al formato de datos por defecto
	dinkeyboard->SetDataFormat(&c_dfDIKeyboard);
	dinmouse->SetDataFormat(&c_dfDIMouse);

	// Asignamos el control que tendremos en la ventana sobre los dispositivos y su relaci���³n con otras aplicaciones
	dinkeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
	dinmouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
	
	// Obtenemos la posici���³n inicial del rat���³n
	GetCursorPos(&RatonPos);
}

// Obtenci���³n de datos actuales introducidos.
void ManejadorDirectInput::detect_input(void)
{
	// Obtenemos acceso por si no lo tenemos
	dinkeyboard->Acquire();
	// Obtenemos los datos de entrada y los volcamos en la variable apropiada
	dinkeyboard->GetDeviceState(256, (LPVOID)keystate);
		
	dinmouse->Acquire();
	dinmouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mousestate);
	// Le ponemos l���­mite al movimiento del rat���³n
	RECT rc;
	GetWindowRect(GetDesktopWindow(), &rc);
	if(RatonPos.x+mousestate.lX < rc.right && RatonPos.x+mousestate.lX > rc.left)RatonPos.x+=mousestate.lX;
	if(RatonPos.y+mousestate.lY < rc.bottom && RatonPos.y+mousestate.lY > rc.top)RatonPos.y+=mousestate.lY;
}
	
bool ManejadorDirectInput::MousePressedButton(int Boton){
	return mousestate.rgbButtons[Boton];
}
bool ManejadorDirectInput::MouseReleasedButton(int Boton){
	return !mousestate.rgbButtons[Boton];
}

POINT ManejadorDirectInput::GetMousePosition(void){
	return RatonPos;
}
// Deinicializamos DirectInput.
void ManejadorDirectInput::cleanDInput(void)
{
	dinkeyboard->Unacquire();    // Nos aseguramos que el teclado no est���© en uso
	dinmouse->Unacquire();    // Nos aseguramos que el teclado no est���¡ en uso
	din->Release();    // Cerramos DirectInput antes de finalizar
}

Revision: 41313
at February 16, 2011 02:44 by aday


Updated Code
---------------------------------- DirectInput.h -------------------------------------------

/* Esto se utilizar�¡ para poder manejar en cualquier programa los eventos de interacci�³n.
	Se han puesto en una clase aparte para obtener m�¡s portabilidad de este c�³digo.	*/

				/* By Aday Meli�¡n Carrillo for the common knowledge */

#define INITGUID
#define DIRECTINPUT_VERSION 0x0800 // Utilizaremos la versi�³n 8 de DirectInput
#include "dinput.h"
#include "Singleton.h"

// Definimos macros que nos ayuden a detectar las pulsaciones
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) 

// Mouse Buttons
#define MOUSE_LEFTBUTTON 0
#define MOUSE_RIGHTBUTTON 1
#define MOUSE_MIDDLEBUTTON 2
#define MOUSE_4BUTTON 3
#define MOUSE_5BUTTON 4
#define MOUSE_6BUTTON 5
#define MOUSE_7BUTTON 6
#define MOUSE_8BUTTON 7

// Necesitaremos incluir en el Linker las siguientes librer�­as situadas en el directorio de DirectX:
	//"dinput8.lib"
	//"dxguid.lib"

class ManejadorDirectInput: public Singleton<ManejadorDirectInput> {
private:
	// Variables Necesarias
	LPDIRECTINPUT8 din;    // Puntero a nuestra interfaz DirectInput
	// Teclado
	LPDIRECTINPUTDEVICE8 dinkeyboard;    // Puntero al dispositivo del teclado
	BYTE keystate[256];    // El almacenamiento de los estados de las teclas del teclado
	// Rat�³n
	LPDIRECTINPUTDEVICE8 dinmouse;    // Puntero al dispositivo de rat�³n
	DIMOUSESTATE mousestate;    // Almacenamiento de la informaci�³n del rat�³n
	POINT RatonPos;
public:
	void initDInput(HINSTANCE hInstance, HWND hWnd);    // Inicializamos DirectInput
	void detect_input(void);    // Obtenemos el estado actual de las entradas
	bool MousePressedButton(int Boton); // Obtenemos si el bot�³n pasado por par�¡metro est�¡ pulsado
	bool MouseReleasedButton(int Boton); // Obtenemos si el bot�³n pasado por par�¡metro est�¡ suelto
	POINT GetMousePosition(void); // Obtenemos la posici�³n absoluta actual del rat�³n
	void cleanDInput(void);    // Deinicializa DirectInput y libera la memoria
};

---------------------------------- DirectInput.cpp -----------------------------------------

#include "DirectInput.h"

// Inicializaci�³n de DirectInput
void ManejadorDirectInput::initDInput(HINSTANCE hInstance, HWND hWnd)
{
	// Creamos las interfaz DirectInput
	DirectInput8Create(hInstance,    // Manejador de la aplicaci�³n
					   DIRECTINPUT_VERSION,    // Versi�³n compatible
					   IID_IDirectInput8,    // Versi�³n de la interfaz de DirectInput
					   (void**)&din,    // El puntero a la interfaz
					   NULL);    // Opciones de COM, lo dejaremos a NULL
	dinmouse = NULL;
	dinkeyboard = NULL;
	// Creamos el dispositivo de Teclado
	din->CreateDevice(GUID_SysKeyboard,    // El ID del teclado por defecto que se est�¡ usando
					  &dinkeyboard,    // El puntero a la interfaz del dispositivo
					  NULL);    // Opciones de COM, lo dejaremos a NULL
	// Creamos el dispositivo del rat�³n
	din->CreateDevice(GUID_SysMouse,
                      &dinmouse,
                      NULL);

	// Asignamos el formato de datos al formato de datos por defecto
	dinkeyboard->SetDataFormat(&c_dfDIKeyboard);
	dinmouse->SetDataFormat(&c_dfDIMouse);

	// Asignamos el control que tendremos en la ventana sobre los dispositivos y su relaci�³n con otras aplicaciones
	dinkeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
	dinmouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
	
	// Obtenemos la posici�³n inicial del rat�³n
	GetCursorPos(&RatonPos);
}

// Obtenci�³n de datos actuales introducidos.
void ManejadorDirectInput::detect_input(void)
{
	// Obtenemos acceso por si no lo tenemos
	dinkeyboard->Acquire();
	// Obtenemos los datos de entrada y los volcamos en la variable apropiada
	dinkeyboard->GetDeviceState(256, (LPVOID)keystate);
		
	dinmouse->Acquire();
	dinmouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mousestate);
	// Le ponemos l�­mite al movimiento del rat�³n
	RECT rc;
	GetWindowRect(GetDesktopWindow(), &rc);
	if(RatonPos.x+mousestate.lX < rc.right && RatonPos.x+mousestate.lX > rc.left)RatonPos.x+=mousestate.lX;
	if(RatonPos.y+mousestate.lY < rc.bottom && RatonPos.y+mousestate.lY > rc.top)RatonPos.y+=mousestate.lY;
}
	
bool ManejadorDirectInput::MousePressedButton(int Boton){
	return mousestate.rgbButtons[Boton];
}
bool ManejadorDirectInput::MouseReleasedButton(int Boton){
	return !mousestate.rgbButtons[Boton];
}

POINT ManejadorDirectInput::GetMousePosition(void){
	return RatonPos;
}
// Deinicializamos DirectInput.
void ManejadorDirectInput::cleanDInput(void)
{
	dinkeyboard->Unacquire();    // Nos aseguramos que el teclado no est�© en uso
	dinmouse->Unacquire();    // Nos aseguramos que el teclado no est�¡ en uso
	din->Release();    // Cerramos DirectInput antes de finalizar
}

Revision: 41312
at February 16, 2011 02:43 by aday


Updated Code
---------------------------------- DirectInput.h -------------------------------------------

/* Esto se utilizará para poder manejar en cualquier programa los eventos de interacción.
	Se han puesto en una clase aparte para obtener más portabilidad de este código.	*/

				/* By Aday Melián Carrillo for the common knowledge */

#define INITGUID
#define DIRECTINPUT_VERSION 0x0800 // Utilizaremos la versión 8 de DirectInput
#include "dinput.h"
#include "Singleton.h"

// Definimos macros que nos ayuden a detectar las pulsaciones
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) 

// Mouse Buttons
#define MOUSE_LEFTBUTTON 0
#define MOUSE_RIGHTBUTTON 1
#define MOUSE_MIDDLEBUTTON 2
#define MOUSE_4BUTTON 3
#define MOUSE_5BUTTON 4
#define MOUSE_6BUTTON 5
#define MOUSE_7BUTTON 6
#define MOUSE_8BUTTON 7

// Necesitaremos incluir en el Linker las siguientes librerías situadas en el directorio de DirectX:
	//"dinput8.lib"
	//"dxguid.lib"

class ManejadorDirectInput: public Singleton<ManejadorDirectInput> {
private:
	// Variables Necesarias
	LPDIRECTINPUT8 din;    // Puntero a nuestra interfaz DirectInput
	// Teclado
	LPDIRECTINPUTDEVICE8 dinkeyboard;    // Puntero al dispositivo del teclado
	BYTE keystate[256];    // El almacenamiento de los estados de las teclas del teclado
	// Ratón
	LPDIRECTINPUTDEVICE8 dinmouse;    // Puntero al dispositivo de ratón
	DIMOUSESTATE mousestate;    // Almacenamiento de la información del ratón
	POINT RatonPos;
public:
	void initDInput(HINSTANCE hInstance, HWND hWnd);    // Inicializamos DirectInput
	void detect_input(void);    // Obtenemos el estado actual de las entradas
	bool MousePressedButton(int Boton); // Obtenemos si el botón pasado por parámetro está pulsado
	bool MouseReleasedButton(int Boton); // Obtenemos si el botón pasado por parámetro está suelto
	POINT GetMousePosition(void); // Obtenemos la posición absoluta actual del ratón
	void cleanDInput(void);    // Deinicializa DirectInput y libera la memoria
};

---------------------------------- DirectInput.cpp -----------------------------------------

#include "DirectInput.h"

// Inicialización de DirectInput
void ManejadorDirectInput::initDInput(HINSTANCE hInstance, HWND hWnd)
{
	// Creamos las interfaz DirectInput
	DirectInput8Create(hInstance,    // Manejador de la aplicación
					   DIRECTINPUT_VERSION,    // Versión compatible
					   IID_IDirectInput8,    // Versión de la interfaz de DirectInput
					   (void**)&din,    // El puntero a la interfaz
					   NULL);    // Opciones de COM, lo dejaremos a NULL
	dinmouse = NULL;
	dinkeyboard = NULL;
	// Creamos el dispositivo de Teclado
	din->CreateDevice(GUID_SysKeyboard,    // El ID del teclado por defecto que se está usando
					  &dinkeyboard,    // El puntero a la interfaz del dispositivo
					  NULL);    // Opciones de COM, lo dejaremos a NULL
	// Creamos el dispositivo del ratón
	din->CreateDevice(GUID_SysMouse,
                      &dinmouse,
                      NULL);

	// Asignamos el formato de datos al formato de datos por defecto
	dinkeyboard->SetDataFormat(&c_dfDIKeyboard);
	dinmouse->SetDataFormat(&c_dfDIMouse);

	// Asignamos el control que tendremos en la ventana sobre los dispositivos y su relación con otras aplicaciones
	dinkeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
	dinmouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
	
	// Obtenemos la posición inicial del ratón
	GetCursorPos(&RatonPos);
}

// Obtención de datos actuales introducidos.
void ManejadorDirectInput::detect_input(void)
{
	// Obtenemos acceso por si no lo tenemos
	dinkeyboard->Acquire();
	// Obtenemos los datos de entrada y los volcamos en la variable apropiada
	dinkeyboard->GetDeviceState(256, (LPVOID)keystate);
		
	dinmouse->Acquire();
	dinmouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mousestate);
	// Le ponemos límite al movimiento del ratón
	RECT rc;
	GetWindowRect(GetDesktopWindow(), &rc);
	if(RatonPos.x+mousestate.lX < rc.right && RatonPos.x+mousestate.lX > rc.left)RatonPos.x+=mousestate.lX;
	if(RatonPos.y+mousestate.lY < rc.bottom && RatonPos.y+mousestate.lY > rc.top)RatonPos.y+=mousestate.lY;
}
	
bool ManejadorDirectInput::MousePressedButton(int Boton){
	return mousestate.rgbButtons[Boton];
}
bool ManejadorDirectInput::MouseReleasedButton(int Boton){
	return !mousestate.rgbButtons[Boton];
}

POINT ManejadorDirectInput::GetMousePosition(void){
	return RatonPos;
}
// Deinicializamos DirectInput.
void ManejadorDirectInput::cleanDInput(void)
{
	dinkeyboard->Unacquire();    // Nos aseguramos que el teclado no esté en uso
	dinmouse->Unacquire();    // Nos aseguramos que el teclado no está en uso
	din->Release();    // Cerramos DirectInput antes de finalizar
}

Revision: 41311
at February 16, 2011 02:42 by aday


Initial Code
---------------------------------- DirectInput.h -------------------------------------------

/* Esto se utilizará para poder manejar en cualquier programa los eventos de interacción.
	Se han puesto en una clase aparte para obtener más portabilidad de este código.	*/

				/* By Aday Melián Carrillo for the common knowledge */

#define INITGUID
#define DIRECTINPUT_VERSION 0x0800 // Utilizaremos la versión 8 de DirectInput
#include "dinput.h"
#include "Singleton.h"

// Definimos macros que nos ayuden a detectar las pulsaciones
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1) 

// Mouse Buttons
#define MOUSE_LEFTBUTTON 0
#define MOUSE_RIGHTBUTTON 1
#define MOUSE_MIDDLEBUTTON 2
#define MOUSE_4BUTTON 3
#define MOUSE_5BUTTON 4
#define MOUSE_6BUTTON 5
#define MOUSE_7BUTTON 6
#define MOUSE_8BUTTON 7

// Necesitaremos incluir en el Linker las siguientes librerías situadas en el directorio de DirectX:
	//"dinput8.lib"
	//"dxguid.lib"

class ManejadorDirectInput: public Singleton<ManejadorDirectInput> {
private:
	// Variables Necesarias
	LPDIRECTINPUT8 din;    // Puntero a nuestra interfaz DirectInput
	// Teclado
	LPDIRECTINPUTDEVICE8 dinkeyboard;    // Puntero al dispositivo del teclado
	BYTE keystate[256];    // El almacenamiento de los estados de las teclas del teclado
	// Ratón
	LPDIRECTINPUTDEVICE8 dinmouse;    // Puntero al dispositivo de ratón
	DIMOUSESTATE mousestate;    // Almacenamiento de la información del ratón
	POINT RatonPos;
public:
	void initDInput(HINSTANCE hInstance, HWND hWnd);    // Inicializamos DirectInput
	void detect_input(void);    // Obtenemos el estado actual de las entradas
	bool MousePressedButton(int Boton); // Obtenemos si el botón pasado por parámetro está pulsado
	bool MouseReleasedButton(int Boton); // Obtenemos si el botón pasado por parámetro está suelto
	POINT GetMousePosition(void); // Obtenemos la posición absoluta actual del ratón
	void cleanDInput(void);    // Deinicializa DirectInput y libera la memoria
};

---------------------------------- DirectInput.cpp -----------------------------------------

#include "DirectInput.h"

// Inicialización de DirectInput
void ManejadorDirectInput::initDInput(HINSTANCE hInstance, HWND hWnd)
{
	// Creamos las interfaz DirectInput
	DirectInput8Create(hInstance,    // Manejador de la aplicación
					   DIRECTINPUT_VERSION,    // Versión compatible
					   IID_IDirectInput8,    // Versión de la interfaz de DirectInput
					   (void**)&din,    // El puntero a la interfaz
					   NULL);    // Opciones de COM, lo dejaremos a NULL
	dinmouse = NULL;
	dinkeyboard = NULL;
	// Creamos el dispositivo de Teclado
	din->CreateDevice(GUID_SysKeyboard,    // El ID del teclado por defecto que se está usando
					  &dinkeyboard,    // El puntero a la interfaz del dispositivo
					  NULL);    // Opciones de COM, lo dejaremos a NULL
	// Creamos el dispositivo del ratón
	din->CreateDevice(GUID_SysMouse,
                      &dinmouse,
                      NULL);

	// Asignamos el formato de datos al formato de datos por defecto
	dinkeyboard->SetDataFormat(&c_dfDIKeyboard);
	dinmouse->SetDataFormat(&c_dfDIMouse);

	// Asignamos el control que tendremos en la ventana sobre los dispositivos y su relación con otras aplicaciones
	dinkeyboard->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
	dinmouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
	
	// Obtenemos la posición inicial del ratón
	GetCursorPos(&RatonPos);
}

// Obtención de datos actuales introducidos.
void ManejadorDirectInput::detect_input(void)
{
	// Obtenemos acceso por si no lo tenemos
	dinkeyboard->Acquire();
	// Obtenemos los datos de entrada y los volcamos en la variable apropiada
	dinkeyboard->GetDeviceState(256, (LPVOID)keystate);
		
	dinmouse->Acquire();
	dinmouse->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&mousestate);
	// Le ponemos límite al movimiento del ratón
	RECT rc;
	GetWindowRect(GetDesktopWindow(), &rc);
	if(RatonPos.x+mousestate.lX < rc.right && RatonPos.x+mousestate.lX > rc.left)RatonPos.x+=mousestate.lX;
	if(RatonPos.y+mousestate.lY < rc.bottom && RatonPos.y+mousestate.lY > rc.top)RatonPos.y+=mousestate.lY;
}
	
bool ManejadorDirectInput::MousePressedButton(int Boton){
	return mousestate.rgbButtons[Boton];
}
bool ManejadorDirectInput::MouseReleasedButton(int Boton){
	return !mousestate.rgbButtons[Boton];
}

POINT ManejadorDirectInput::GetMousePosition(void){
	return RatonPos;
}
// Deinicializamos DirectInput.
void ManejadorDirectInput::cleanDInput(void)
{
	dinkeyboard->Unacquire();    // Nos aseguramos que el teclado no esté en uso
	dinmouse->Unacquire();    // Nos aseguramos que el teclado no está en uso
	din->Release();    // Cerramos DirectInput antes de finalizar
}

Initial URL


Initial Description
You have to link to "dinput8.lib" and include SDK folder into your project settings.
This code works using DirectX SDK (June 2010). 
I made it on a Singleton to make the access to it easier.
Comments in spanish because I'm spanish.
           Be happy! :)

Initial Title
DirectInput Easy Implementation

Initial Tags


Initial Language
C++