C# 如何使用SharpDX DirectInput检查操纵杆上的滑块?
我正在进行多操纵杆设置,在这里我需要构建自定义按钮映射。甚至可以跨设备绘制地图。例如,如果有一个单独的操纵杆和油门象限,我需要将“Z”或任何东西映射到油门输入。在构建映射配置文件时,我还需要能够检查并查看每个杆上是否有可用的滑块等。我不知道如何说:C# 如何使用SharpDX DirectInput检查操纵杆上的滑块?,c#,winforms,sharpdx,joystick,directinput,C#,Winforms,Sharpdx,Joystick,Directinput,我正在进行多操纵杆设置,在这里我需要构建自定义按钮映射。甚至可以跨设备绘制地图。例如,如果有一个单独的操纵杆和油门象限,我需要将“Z”或任何东西映射到油门输入。在构建映射配置文件时,我还需要能够检查并查看每个杆上是否有可用的滑块等。我不知道如何说: if(多功能操纵杆、多功能滑杆) 到目前为止,我已经尝试了不同的 PropertyInfo rxprop = typeof(SharpDX.DirectInput.JoystickState).GetProperty("Sliders"); 但是,
if(多功能操纵杆、多功能滑杆)
到目前为止,我已经尝试了不同的
PropertyInfo rxprop = typeof(SharpDX.DirectInput.JoystickState).GetProperty("Sliders");
但是,如果操纵杆没有滑块,这当然会引发异常。如果它只有一个滑块,我将始终返回一个包含两个值的滑块[]的Int数组,无论该棒是否只有一个滑块。因此,这并不是一种确定滑块是否存在,甚至有多少滑块存在的可靠方法。如果没有第二个实际滑块,则值滑块[1]始终为0,但如果有第二个滑块,则它可能仍处于0位置
目前这就是我一直在处理的问题:
usbjoysticks[k].Poll();
JoystickState currentState = null;
try
{
currentState = usbjoysticks[k].GetCurrentState();
//joystickmap.axisRangeMax = usbjoysticks[k].GetObjectInfoById(1);
PropertyInfo rxprop = typeof(SharpDX.DirectInput.JoystickState).GetProperty("Sliders");
var rzvalue = (int[])rxprop.GetValue(currentState, null);
var mySlider1 = rzvalue[0];
var datas = usbjoysticks[k].GetBufferedData();
foreach (var state in datas)
{
Console.WriteLine(state);
if (state.Offset == JoystickOffset.X)
{
Console.WriteLine(state.Value);
}
}
//DeviceObjectInstance my = usbjoysticks[k].GetObjectInfoByName("Sliders1");
var stuff = usbjoysticks[k].GetObjectPropertiesByName("Sliders0");
//=================
joystickmap.jX = "X";
joystickmap.axisRangeMax = usbjoysticks[k].GetObjectPropertiesByName("Y").Range.Maximum; //65535
joystickmap.jY = "Y";
if (currentState.Z != 0)
{
joystickmap.jZ = "Z";
var maxZrange = usbjoysticks[k].GetObjectPropertiesByName("Z").Range.Maximum;
joystickmap.axisRangeMax = usbjoysticks[k].GetObjectPropertiesByName("Z").Range.Maximum;
}
if (currentState.Sliders[0] != 0 || currentState.Sliders[1] != 0) //TODO possible change to Joystick State value in class object instead of text.
{
joystickmap.SLD1 = "Slider1";
//joystickmap.jZ = "Sliders";
joystickmap.jsSliders = currentState.Sliders;
var maxSld1range = usbjoysticks[k].GetObjectPropertiesByName("Sliders0").Range.Maximum;
joystickmap.sld1 = joystickmap.jsSliders[0];
joystickmap.sld2 = joystickmap.jsSliders[1];
}
if (currentState.Sliders[1] != 0)
{
joystickmap.SLD2 = "Slider2";
}
if (currentState.RotationX != 0)
{
joystickmap.rX = "RotationX";
}
if (currentState.RotationY != 0)
{
joystickmap.rY = "RotationY";
}
if (currentState.RotationZ != 0)
{
joystickmap.rZ = "RotationZ";
//joystickmap.jZ = "RotationZ";
}
joystickmap.axisdivider = 2;
for (var b = 0; b < 20; b++)
{
//joystickmap.joybuttons.Add(currentState.Buttons[b]);
joystickmap.joybuttons[b] = (b + 1);
}
joystickmappings.Add(joystickmap);
if (!File.Exists(filename))
{
File.WriteAllText(filename, JsonConvert.SerializeObject(joystickmap));
// serialize JSON directly to a file
using (StreamWriter file = File.CreateText(filename))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(file, joystickmap);
}
}
}
catch (Exception e)
{
MessageBox.Show("USB joystick map creation failure!\n" + e.Message);
break;
}
usbjoysticks[k].Poll();
JoystickState currentState=null;
尝试
{
currentState=usbjoysticks[k].GetCurrentState();
//joystickmap.axisRangeMax=usbjoysticks[k].GetObjectInfoById(1);
PropertyInfo rxprop=typeof(SharpDX.DirectInput.JoystickState).GetProperty(“滑块”);
var rzvalue=(int[])rxprop.GetValue(currentState,null);
var mySlider1=rzvalue[0];
var data=usbjoysticks[k].GetBufferedData();
foreach(数据中的var状态)
{
控制台写入线(状态);
if(state.Offset==JoystickOffset.X)
{
Console.WriteLine(state.Value);
}
}
//DeviceObjectInstance my=usbjoysticks[k].GetObjectInfoByName(“滑块1”);
var stuff=usbjoysticks[k].GetObjectPropertiesByName(“滑块0”);
//=================
joystickmap.jX=“X”;
joystickmap.axisRangeMax=usbjoysticks[k].GetObjectPropertiesByName(“Y”).Range.Maximum;//65535
joystickmap.jY=“Y”;
如果(currentState.Z!=0)
{
joystickmap.jZ=“Z”;
var maxZrange=usbjoysticks[k].GetObjectPropertiesByName(“Z”).Range.Maximum;
joystickmap.axisRangeMax=usbjoysticks[k].GetObjectPropertiesByName(“Z”).Range.Maximum;
}
if(currentState.Sliders[0]!=0 | | currentState.Sliders[1]!=0)//在类对象中可能更改为操纵杆状态值,而不是文本。
{
joystickmap.SLD1=“滑块1”;
//joystickmap.jZ=“滑块”;
joystickmap.jsSliders=currentState.Sliders;
var maxSld1range=usbjoysticks[k].GetObjectPropertiesByName(“滑块0”).Range.max;
joystickmap.sld1=joystickmap.jsSliders[0];
joystickmap.sld2=joystickmap.jsSliders[1];
}
如果(currentState.Sliders[1]!=0)
{
joystickmap.SLD2=“滑块2”;
}
如果(currentState.RotationX!=0)
{
joystickmap.rX=“旋转X”;
}
如果(currentState.RotationY!=0)
{
joystickmap.rY=“旋转”;
}
如果(currentState.RotationZ!=0)
{
joystickmap.rZ=“旋转Z”;
//joystickmap.jZ=“RotationZ”;
}
joystickmap.axisdivider=2;
对于(var b=0;b<20;b++)
{
//joystickmap.joybuttons.Add(currentState.Buttons[b]);
joystickmap.joybuttons[b]=(b+1);
}
添加(joystickmap);
如果(!File.Exists(filename))
{
WriteAllText(文件名,JsonConvert.SerializeObject(joystickmap));
//将JSON直接序列化到文件
使用(StreamWriter file=file.CreateText(文件名))
{
JsonSerializer serializer=新的JsonSerializer();
serializer.Serialize(文件,joystickmap);
}
}
}
捕获(例外e)
{
MessageBox.Show(“USB操纵杆地图创建失败!\n”+e.Message);
打破
}
根据此处的页面,滑块似乎是一种特殊情况->。看起来您正在接近一个解决方案,但是测试0,这是控制器的静止状态值吗?@ErnieDingo 0是当前物理位置值,或者是滑块不存在时返回的值。我不知道你所说的“静止状态”是什么意思。静止状态表示机构是否处于其默认位置。对于一个操纵杆来说,它是居中的。啊,对了,这是问题的一部分。在这种情况下,滑块没有弹簧驱动或其他自动静止状态。他们可以被留在任何位置,所以不能保证。我的意思是,我可以制定一个标准的操作程序,说明程序无法初始化,直到有人手动将所有滑块返回到中间位置,以确保返回的值不是0,但这非常糟糕。必须有一种方法来检测,即使是在其静止状态下。将检查我的代码,看看是否有任何弹出。听起来对你来说是个挑战