下面贴出核心代码
/// <summary>
/// 初始化操作杆
/// </summary>
/// <returns></returns>
public bool InitDirectInput()
{
// 遍历系统中的操纵杆设备
foreach (DeviceInstance instance in Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly))
{
// 选第一个操纵杆设备并实例化Device
applicationDevice = new Device(instance.InstanceGuid);
break;
}
if (applicationDevice==null)
{
MessageBox.Show("操纵杆加载失败", "没有发现操纵杆");
return false;
}
// 设置操纵杆默认预定的格式
applicationDevice.SetDataFormat(DeviceDataFormat.Joystick);
// 设置操纵杆设备CooperativeLevel属性
applicationDevice.SetCooperativeLevel(this, CooperativeLevelFlags.Exclusive | CooperativeLevelFlags.Foreground);
// 遍历操纵杆设备上的所有对象。
foreach (DeviceObjectInstance d in applicationDevice.Objects)
{
//力反馈信息
if (((d.ObjectId & (int) DeviceObjectTypeFlags.Axis) != 0))
{
// 设置输入范围
applicationDevice.Properties.SetRange(ParameterHow.ById, d.ObjectId, new InputRange(-1000, +1000));
}
//反馈操纵杆的按钮信息显示对应界面按钮
UpdateControls(d);
}
return true;
}
/// <summary>
/// 获取操纵杆数据
/// </summary>
public void GetData()
{
// 确保操纵杆设备有效
if ( applicationDevice==null)
return;
try
{
// 获取Poll信息
applicationDevice.Poll();
}
catch (InputException inputex)
{
if ((inputex is NotAcquiredException) || (inputex is InputLostException))
{
try
{
// 获取设备信息
applicationDevice.Acquire();
}
catch (InputException)
{
//设备获取失败,原因可能是焦点没有在此窗体内
return;
}
}
} //catch(InputException inputex)
//获取设备状态
try
{
state = applicationDevice.CurrentJoystickState;
}
catch (InputException)
{
return;
}
try
{
//更新UI
UpdateUI();
}
catch
{
}
}