C# 如何使用SharpDX DirectInput检查操纵杆上的滑块?

C# 如何使用SharpDX DirectInput检查操纵杆上的滑块?,c#,winforms,sharpdx,joystick,directinput,C#,Winforms,Sharpdx,Joystick,Directinput,我正在进行多操纵杆设置,在这里我需要构建自定义按钮映射。甚至可以跨设备绘制地图。例如,如果有一个单独的操纵杆和油门象限,我需要将“Z”或任何东西映射到油门输入。在构建映射配置文件时,我还需要能够检查并查看每个杆上是否有可用的滑块等。我不知道如何说: if(多功能操纵杆、多功能滑杆) 到目前为止,我已经尝试了不同的 PropertyInfo rxprop = typeof(SharpDX.DirectInput.JoystickState).GetProperty("Sliders"); 但是,

我正在进行多操纵杆设置,在这里我需要构建自定义按钮映射。甚至可以跨设备绘制地图。例如,如果有一个单独的操纵杆和油门象限,我需要将“Z”或任何东西映射到油门输入。在构建映射配置文件时,我还需要能够检查并查看每个杆上是否有可用的滑块等。我不知道如何说:
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,但这非常糟糕。必须有一种方法来检测,即使是在其静止状态下。将检查我的代码,看看是否有任何弹出。听起来对你来说是个挑战