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

📄 input.cpp

📁 泡泡堂单机版,可能被转载够很多次,不过这个是比较完整的,一个很好的学习材料.
💻 CPP
字号:
#include "input.h"

#define	SAFE_RELEASE(p)			{if (p) { p->Release();	p = NULL;}}

CInput::CInput(void)
{
	m_pDirectInput = NULL;
	m_pKeyboard = NULL;
	m_pMouse = NULL;
	memset((void*)m_KeyboardState,0,sizeof(m_KeyboardState));
}

CInput::~CInput(void)
{
	Destroy();
}

HRESULT	CInput::Create(HWND hWnd, HINSTANCE hInstance)
{
	/*
		SetCooperativeLevel函数,它的第二个参数由两部分构成,第一部分用于指定是
		前台访问还是后台访问(DISCL_FOREGROUND或DISCL_BACKGROUND),第二部分用于指
		定是独占还是非独占模式(DISCL_EXCLUSIVE或DISCL_NONEXCLUSIVE)。下面是这
		四个标识所代表的意义:
		DISCL_FOREGROUND:输入设备处于前台(有焦点)时可访问,处于后台时失去设备获取。
		DISCL_BACKGROUND:输入设备处于前台、后台时均可访问。
		DISCL_EXCLUSIVE:独占模式,一旦得到准许,在获取设备时其它程序便不能独占此设备。
		DISCL_NONEXCLUSIVE:非独占模式,这时对该设备的访问将不会因其它应用程序对该设备的使用而受到干扰。
	*/

	if(FAILED(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, 
		IID_IDirectInput8, (void**)&m_pDirectInput, NULL))) 
	{ 
		return E_FAIL;
	}

	//	KEYBOARD
	if(FAILED(m_pDirectInput->CreateDevice(GUID_SysKeyboard, &m_pKeyboard, NULL))) 
	{ 
		Destroy();
		return E_FAIL;
	}

	if(FAILED(m_pKeyboard->SetDataFormat(&c_dfDIKeyboard)))
	{ 
		Destroy();
		return E_FAIL;
	}

	if(FAILED(m_pKeyboard->SetCooperativeLevel(hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE)))
	{ 
		Destroy();
		return E_FAIL;
	}

	if(m_pKeyboard)
	{
		m_pKeyboard->Acquire(); 
	}

	//	MOUSE
	if(FAILED(m_pDirectInput->CreateDevice(GUID_SysMouse, &m_pMouse, NULL)))
	{ 
		Destroy();
		return E_FAIL;
	}

	if(FAILED(m_pMouse->SetDataFormat(&c_dfDIMouse)))
	{ 
		Destroy();
		return E_FAIL;
	}

	if(FAILED(m_pMouse->SetCooperativeLevel(hWnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE)))
	{ 
		Destroy();
		return E_FAIL;
	}

	if(m_pMouse)
	{
		m_pMouse->Acquire(); 
	}

	return S_OK;
}

HRESULT	CInput::GetKeyboardState()
{
	memcpy((void*)m_Buffer,(void*)m_KeyboardState,sizeof(m_Buffer));

	if(FAILED(m_pKeyboard->GetDeviceState(sizeof(m_KeyboardState),(LPVOID)m_KeyboardState)))
	{ 
		return	E_FAIL;
	} 
	return	S_OK;
}

bool	CInput::IsKeyDown(int key)
{
	return	(m_KeyboardState[key] & 0x80);
}

bool	CInput::IsKeyDownToggle(int key)
{
	return	((m_KeyboardState[key] & 0x80) && !(m_Buffer[key] & 0x80));
}

HRESULT	CInput::GetMouseState()
{
	if(FAILED(m_pMouse->GetDeviceState(sizeof(m_MouseState),(LPVOID)&m_MouseState)))
	{ 
		return	E_FAIL;
	} 
	return	S_OK;
}

int	CInput::IsMouseDown(int key)
{
	return	(m_MouseState.rgbButtons[key] & 0x80);
}

void	CInput::GetCursorPos(long& x,long& y,long& z)
{
	x = m_MouseState.lX;
	y = m_MouseState.lY;
	z = m_MouseState.lZ;
}

void	CInput::Destroy()
{
	if(m_pKeyboard)
	{
		m_pKeyboard->Unacquire(); 
	}

	if(m_pMouse)
	{
		m_pMouse->Unacquire();
	}

	SAFE_RELEASE(m_pMouse);
	SAFE_RELEASE(m_pKeyboard);
	SAFE_RELEASE(m_pDirectInput);
}

⌨️ 快捷键说明

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