📄 keyboard.cpp
字号:
#include "stdafx.h"
#pragma comment( lib, "dinput8.lib" )
CKeyboard* CKeyboard::m_Instance = 0;
CKeyboard* CKeyboard::Instance()
{
if(m_Instance == 0)
m_Instance = new CKeyboard;
return m_Instance;
}
CKeyboard::CKeyboard(void)
{
LPDIRECTINPUT8 m_pDI = NULL;
LPDIRECTINPUTDEVICE8 m_pKeyboard = NULL;
}
CKeyboard::~CKeyboard(void)
{
//干掉键盘
if( m_pKeyboard ) m_pKeyboard->Unacquire();
SAFE_RELEASE( m_pKeyboard );
SAFE_RELEASE( m_pDI );
}
bool CKeyboard::Create(HINSTANCE hInst,HWND hWnd)
{
HRESULT hr;
//创建DInput对象
if( FAILED( hr = DirectInput8Create( hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_pDI, NULL )))
{
DebugMsg("DirectInptu8Create Error\n");
return false;
}
//获得键盘操作界面
if( FAILED( hr = m_pDI->CreateDevice( GUID_SysKeyboard, &m_pKeyboard, NULL )))
{
DebugMsg("CreateDevice Error\n");
return false;
}
//设置数据格式
if( FAILED( hr = m_pKeyboard->SetDataFormat( &c_dfDIKeyboard )))
{
DebugMsg("Set Data Format for DInupt Error\n");
return false;
}
if( FAILED( hr = m_pKeyboard->SetCooperativeLevel( hWnd,DISCL_NONEXCLUSIVE | DISCL_FOREGROUND )))
{
DebugMsg("DInupt Cooperative Level Error\n");
return false;
}
DIPROPDWORD dipdw;
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = KEY_BUFFER_SIZE;
if( FAILED( hr = m_pKeyboard->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph ) ) )
{
DebugMsg("DInput SetProperty Error");
return false;
}
//获得键盘
m_pKeyboard->Acquire();
return true;
}
void CKeyboard::GetKeyboardState(void)
{
//立即模式接受信息------------------------------------------------
HRESULT hr;
if( NULL == m_pKeyboard )
return;
ZeroMemory( &m_diks, sizeof(m_diks) );
hr = m_pKeyboard->GetDeviceState( sizeof(m_diks), &m_diks );
//缓冲模式接受信息------------------------------------------------
ZeroMemory(m_didod, sizeof(DIDEVICEOBJECTDATA) );
m_dwElements = KEY_BUFFER_SIZE;
hr = m_pKeyboard->GetDeviceData( sizeof(DIDEVICEOBJECTDATA),m_didod, &m_dwElements, 0 );
if( hr != DI_OK )
{
hr = m_pKeyboard->Acquire();
while( hr == DIERR_INPUTLOST )
hr = m_pKeyboard->Acquire();
return;
}
}
bool CKeyboard::KeyDown(long value)
{
for( DWORD i = 0; i < m_dwElements; i++ )
{
if(m_didod[ i ].dwOfs == value)
{
if((m_didod[ i ].dwData & 0x80))
return true;
}
}
return false;
}
bool CKeyboard::KeyUp(long value)
{
for( DWORD i = 0; i < m_dwElements; i++ )
{
if(m_didod[ i ].dwOfs == value)
{
if(!(m_didod[ i ].dwData & 0x80))
return true;
}
}
return false;
}
bool CKeyboard::KeyPress(long value)
{
if(m_diks[value] & 0x80)
return true;
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -