⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inputdevice.cpp

📁 VC++ DEMO, used for the beginners and the amour
💻 CPP
字号:
// InputDevice.cpp file.
#include "stdafx.h"
#include "InputDevice.h"
#include "Log.h"
#include "resource.h"
#pragma comment (lib,"dinput8.lib")
#pragma comment (lib,"dxguid.lib")
#define SAFE_RELEASE(x) if(x) { x->Release(); x = NULL; }
#define SAMPLE_BUFFER_SIZE 8

extern LPDIRECTINPUT8                     g_pdi;
extern LPDIRECTINPUTDEVICE8               g_pdiMouse;
extern LPDIRECTINPUTDEVICE8               g_pdiJoystick;
extern LPDIRECTINPUTDEVICE8               g_pdiKeyboard;
Log                                g_Log;
//////////////////////////////////////////////////////////////
BOOL CALLBACK DI_EnumDevicesCallback(LPCDIDEVICEINSTANCE lpddoi,LPVOID pvRef)
{
	ComboBox_AddString(GetDlgItem((HWND)pvRef,IDC_DEVICE_NAME),lpddoi->tszInstanceName);
	return DIENUM_CONTINUE;
}
//////////////////////////////////////////////////////////////
BOOL CALLBACK EnumJoystickDevices(LPCDIDEVICEINSTANCE pdInst, LPVOID pvRef)
{
	DIPROPRANGE dipr;
	DIPROPDWORD dipdw;
	g_pdiJoystick = NULL;
	if(FAILED(g_pdi->CreateDevice(pdInst->guidInstance,&g_pdiJoystick, NULL)))
		return DIENUM_CONTINUE;
	
	// Set the data format
	if(FAILED(g_pdiJoystick->SetDataFormat(&c_dfDIJoystick))) 
	{
		g_pdiJoystick->Release();
		g_pdiJoystick = NULL;
		return DIENUM_CONTINUE;
	}
	
	// Set the cooperative mode
	if(FAILED(g_pdiJoystick->SetCooperativeLevel((HWND)pvRef,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))) 
	{
		g_pdiJoystick->Release();
		g_pdiJoystick = NULL;
		return DIENUM_CONTINUE;
	}
	
	// Clear out the structure first
	ZeroMemory(&dipr, sizeof(DIPROPRANGE));
	dipr.diph.dwSize = sizeof(dipr);
	dipr.diph.dwHeaderSize = sizeof(dipr);
	
	dipr.diph.dwObj = DIJOFS_X;
	dipr.diph.dwHow = DIPH_BYOFFSET;  // offset into data format
	
	dipr.lMin = -1024;
	dipr.lMax = 1024;
	
	if(FAILED(g_pdiJoystick->SetProperty(DIPROP_RANGE,&dipr.diph))) 
	{
		g_pdiJoystick->Release();
		g_pdiJoystick = NULL;
		return DIENUM_CONTINUE;
	}
	
	dipr.diph.dwObj = DIJOFS_Y;
	if(FAILED(g_pdiJoystick->SetProperty(DIPROP_RANGE,&dipr.diph)))
	{
		g_pdiJoystick->Release();
		g_pdiJoystick = NULL;
		return DIENUM_CONTINUE;
	}
    
	// Set X deadzone
	dipdw.diph.dwObj = DIJOFS_X;
	if(FAILED(g_pdiJoystick->SetProperty(DIPROP_DEADZONE, &dipdw.diph)))
	{
		g_pdiJoystick->Release();
		g_pdiJoystick = NULL;
		return DIENUM_CONTINUE;
	}
	
	// Set Y deadzone
	dipdw.diph.dwObj = DIJOFS_Y;
	if(FAILED(g_pdiJoystick->SetProperty(DIPROP_DEADZONE, &dipdw.diph)))
	{
		g_pdiJoystick->Release();
		g_pdiJoystick = NULL;
		return DIENUM_CONTINUE;
	}
	
	// Acquire the device for use
	if(FAILED(g_pdiJoystick->Acquire())) 
	{
		g_pdiJoystick->Release();
		g_pdiJoystick = NULL;
		return DIENUM_CONTINUE;
	}
	
	// Stop enumeration
	return DIENUM_STOP;
}
//////////////////////////////////////////////////////////////
HRESULT DI_InitDirectInput(HINSTANCE hInst,HWND hWnd)
{
	HRESULT hr;
	hr = DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_pdi, NULL);
	if (FAILED(hr))
	{
		//Show hr.
		return E_FAIL;
	}
	hr = g_pdi->EnumDevices(DI8DEVCLASS_ALL, (LPDIENUMDEVICESCALLBACK)DI_EnumDevicesCallback, (LPVOID)hWnd, DIEDFL_ALLDEVICES);
	if (FAILED(hr))
	{
		//Show hr.
		return E_FAIL;
	}
	g_Log.Log_WriteOutput("InitDirectInput: Sucessed\n");
	return S_OK;
	
}
HRESULT DI_Shutdown()
{
	if (g_pdiMouse)
		g_pdiMouse->Unacquire();
	if (g_pdiKeyboard)
		g_pdiKeyboard->Unacquire();
	SAFE_RELEASE(g_pdiMouse);
	SAFE_RELEASE(g_pdiKeyboard);
	SAFE_RELEASE(g_pdi);
	return S_OK;
}
///////////////////////////////////////////////////////////////////
// Name:DI_KeyboardInputDevice()
// Desc:.
///////////////////////////////////////////////////////////////////
LPDIRECTINPUTDEVICE8 DI_KeyboardInputDevice(HWND hwnd,DWORD dwCoopFlags)
{
	LPDIRECTINPUTDEVICE8 pDIDevice;
	
	if(FAILED(g_pdi->CreateDevice(GUID_SysKeyboard, &pDIDevice, NULL)))
		return NULL;
	
	
	if(FAILED(pDIDevice->SetDataFormat(&c_dfDIKeyboard)))
	{
		SAFE_RELEASE(pDIDevice);
		return NULL;
	}
	
	if(FAILED(pDIDevice->SetCooperativeLevel(hwnd,dwCoopFlags)))
	{
		SAFE_RELEASE(pDIDevice);
		return NULL;
	}
	
	if(FAILED(pDIDevice->Acquire())) 
	{
		SAFE_RELEASE(pDIDevice);
		return NULL;
	}	
	g_Log.Log_WriteOutput("DI_KeyboardInputDevice:Sucessed\n");
	return pDIDevice;
}
///////////////////////////////////////////////////////////////////
// Name:DI_MouseInputDevice()
// Desc:
///////////////////////////////////////////////////////////////////
LPDIRECTINPUTDEVICE8 DI_MouseInputDevice(HWND hwnd,DWORD dwCoopFlags)
{
	LPDIRECTINPUTDEVICE8 pDIDevice;
	
	if(FAILED(g_pdi->CreateDevice(GUID_SysMouse, &pDIDevice, NULL)))
		return NULL;
	
	if(FAILED(pDIDevice->SetDataFormat(&c_dfDIMouse2)))
	{
		SAFE_RELEASE(pDIDevice);
		return NULL;
	}
	if(FAILED(pDIDevice->SetCooperativeLevel(hwnd,dwCoopFlags))) 
	{
		SAFE_RELEASE(pDIDevice);
		return NULL;
	}

	if(FAILED(pDIDevice->Acquire()))
	{
		SAFE_RELEASE(pDIDevice);
		return NULL;
	}
	g_Log.Log_WriteOutput("DI_MouseInputDevice:Sucessed\n");
	return pDIDevice;
}
///////////////////////////////////////////////////////////////////
// Name:DI_JoystickInputDevice()
// Desc:.
///////////////////////////////////////////////////////////////////
LPDIRECTINPUTDEVICE8 DI_JoystickInputDevice(HWND hwnd)
{
  g_pdi->EnumDevices(DI8DEVTYPE_JOYSTICK, EnumJoystickDevices,(void*)hwnd, DIEDFL_ATTACHEDONLY);
  return g_pdiJoystick;
}
///////////////////////////////////////////////////////////////////
// Name:DI_ReadInputDevice()
// Desc:.
///////////////////////////////////////////////////////////////////
HRESULT DI_ReadInputDevice(IDirectInputDevice8 *pDIDevice,void *DataBuffer, long BufferSize)
{
	HRESULT hr;
	
	while(1) {
		// Poll device
		pDIDevice->Poll();
		
		// Read in state
		if(SUCCEEDED(hr = pDIDevice->GetDeviceState(BufferSize,(LPVOID)DataBuffer)))
			break;
		
		// Return on an unknown error  
		if(hr != DIERR_INPUTLOST && hr != DIERR_NOTACQUIRED)
			return E_FAIL;
		
		
		// Reacquire and try again
		if(FAILED(pDIDevice->Acquire()))
			return E_FAIL;
	}
	
	// Return a success
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -