首先电脑需要安装WindowsSDK.
将对游戏手柄的检测封到一个类里,可以直接C++调用,也可以封成dll后C#调用。
代码如下:
Joystick.h
#pragma once
#include "dinput.h"
#include "dinputd.h"
#include <string>
using namespace std;
#define DIRECTINPUT_VERSION 0x0800
#define DI8DEVCLASS_GAMECTRL 4 //扫描游戏控制器
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"dinput8.lib")
/********************************************************************\
功能描述:游戏手柄控制类
\********************************************************************/
class CJoystick
{
public:
CJoystick(void);
~CJoystick(void);
public:
string GetLastErrMsg();
BOOL Init(LONG nMin = -1024, LONG nMax = 1024); //初始化函数
DIJOYSTATE * PollDevice(); // 轮循设备函数,在轮循过程中读取设备状态
//枚举设备
static BOOL CALLBACK DIEnumDevicesCallback(const DIDEVICEINSTANCE* lpddi, VOID* pvRef); //枚举对象
static BOOL CALLBACK EnumObjectsCallback(const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext);
private:
//一般的成员变量
HINSTANCE m_hInstance; // 实例句柄
LPDIRECTINPUT8 m_lpDI; // DI8接口指针
LPDIRECTINPUTDEVICE8 m_lpDIDevice; // DIDevice8接口指针
DIJOYSTATE m_diJs; //存储Joystick状态信息
GUID JoystickGUID; //GUID
LONG m_nMax; //最小值
LONG m_nMin; //最大值
string m_errmsg;
};
#include "StdAfx.h"
#include ".\joystick.h"
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
struct DI_ENUM_CONTEXT
{
DIJOYCONFIG* pPreferredJoyCfg;
bool bPreferredJoyCfgValid;
};
CJoystick::CJoystick()
{
m_lpDIDevice = NULL