USB手柄的控制
Flyli
USB手柄或游戏控制杆并不一定只在打游戏的时候才用得到,为了控制以PC机为核心的机器人能够在手动的控制下运动,略微研究了下USB手柄的控制方法。
通过查阅相关资料,查到了2中USB手柄的控制方法,一种是基于windows DDK的USB开发,由于没有搞到DDK所以暂且不谈这种方法
我们来说说第二种方法,就是以基于DirectX8.1以上的USB手柄控制方法,使用这种方法需要下载Direct的SDK,运用到他的运行库。Dinput8.lib,DxErr.Lib,dxguid.lib另外还需要加载direct的一些头文件,至于头文件具体用到了那些我也没有测试,我把这些可能用到的程序都发到了我的资源中,地址是:http://download.csdn.net/source/402394
其中将所有的.h文件复制到vc的运行库下,把.lib文件加载到工程中就可以使用了。
其使用方法也是相当的简单:
1. 将CDirectInput实例化
2. 调用InitDirectInput初始化USB手柄,通过其返回值判断手柄是否被识别
3. 声明一个DIJOYSTATE2 类型的值用于接收按键的状态
4. 用GetState_Now()声明的DIJOYSTATE2的值进行赋值;
5. DIJOYSTATE2 中部分键值的对应关系 lx,ly分别是对应上下左右的方向,rgbbutton[]的数组是分别用来对应其他的手柄按键。
遇到具体的问题可以再联系我哈
一下是我封装后的类
//********************************************************************
// DirectInput.h 文件
//********************************************************************************
#pragma once
#define DIRECTINPUT_VERSION 0x0800
#define _CRT_SECURE_NO_DEPRECATE
#ifndef _WIN32_DCOM
#define _WIN32_DCOM
#endif
#include <windows.h>
#include <commctrl.h>
#include <basetsd.h>
#include <dinput.h>
#include <dinputd.h>
#include <assert.h>
#include <oleauto.h>
#include <shellapi.h>
#include <wbemidl.h>
#pragma warning( disable : 4996 ) // disable deprecated warning
#include <strsafe.h>
#pragma warning( default : 4996 )
#include "resource.h"
//=============================================================
//宏定义
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
struct XINPUT_DEVICE_NODE
{
DWORD dwVidPid;
XINPUT_DEVICE_NODE* pNext;
};
struct DI_ENUM_CONTEXT
{
DIJOYCONFIG* pPreferredJoyCfg;
bool bPreferredJoyCfgValid;
};
class CDirectInput
{
public:
CDirectInput(void);
public:
~CDirectInput(void);
public: