📄 input.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 + -