本帖最后由 Blue_Pen 于 2014-11-8 23:33 编辑
【C#USB力反馈】BinGoo系列之游戏手柄、操纵杆编程
* 名称:USB游戏手柄、操纵杆案例 * 功能:对usb力反馈信息进行处理,如手柄上下左右键、模拟驾驶器方向盘、按钮、刹车、油门、档位键等,使用微软的Microsoft.DirectX.DirectInput * 说明:引用两个核心dll:Microsoft.DirectX.DirectInput.dll、Microsoft.DirectX.dll,这两个dll在源码dll文件夹中 下面贴出核心代码
[C#] 纯文本查看 复制代码 [/color][/size][/align][align=left][size=3][color=#000000]/// <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
{
}
}
以下是Demo效果图: 源码JoystickDemo下载:
|