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