/ Published in: C++
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! :)
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! :)
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
---------------------------------- 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 }