Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据代码校准游戏控制器_C#_.net_Wpf_Window - Fatal编程技术网

C# 根据代码校准游戏控制器

C# 根据代码校准游戏控制器,c#,.net,wpf,window,C#,.net,Wpf,Window,我期待从一个C WPF应用程序复制一个校准程序。互联网上也有类似的应用程序,例如: 以及: 但是,由于要求您为每个轴选择最小值、中间值和最大值,因此该过程非常繁琐 我有自己的操纵杆板,windows将其识别为游戏控制器。我可以使用DirectInput或任何其他库读取其值。当使用这两个应用中的一个来校准我的操纵杆时,我实际上可以在使用DirectInput轮询值时获得结果。肯定有一种方法可以通过代码来实现 我的目标是开发一个应用程序来同时校准多个轴。我相信DirectInput可以处理这种任务,

我期待从一个C WPF应用程序复制一个校准程序。互联网上也有类似的应用程序,例如:

以及:

但是,由于要求您为每个轴选择最小值、中间值和最大值,因此该过程非常繁琐

我有自己的操纵杆板,windows将其识别为游戏控制器。我可以使用DirectInput或任何其他库读取其值。当使用这两个应用中的一个来校准我的操纵杆时,我实际上可以在使用DirectInput轮询值时获得结果。肯定有一种方法可以通过代码来实现

我的目标是开发一个应用程序来同时校准多个轴。我相信DirectInput可以处理这种任务,或者windows注册表将它们存储在某个地方。可悲的是,在谷歌上搜索了几个小时后,没有足够的结果。请证明我错了

编辑:

DirectInput API中有DeviceProperty.GetCalibrationPoints和DeviceProperty.SetCalibrationPoints函数,但我不知道如何使用它们

这是我的建议


我尝试像这样获取校准点:MyDevice.GetCalibrationPointsParameterHow.ByUsage、MyDevice.DeviceInformation.Usage;但我想我做错了,因为我得到了一个-2147024894错误文件\u未\u发现异常。

我找到了一个部分解决方案,我对它并不满意

以下代码校准点[]点=mDevice.Properties.GetCalibrationPointsParameterHow.ByOffset,0;将为您提供一个包含2个CalibrationPoints对象的数组,对应于控制器的第一个轴。以下是显示这两个点时的情况:

0 缩放值:0原始数据:0 1. 缩放值:10000原始数据:4095

困扰我的是参数。我知道ByOffset参数将为您提供其值数组中的值,这些值的偏移量类似于常规数组,但我必须以4而不是1的增量进行迭代才能得到每个轴。我找不到替代的方法,比如使用sizeofCalibrationPoint,但我知道什么时候停止使用设备可用的轴数进行迭代

最后,您可以通过更改RawData值来使用这两点,并将它们作为参数传递到SetCallibrationPoints函数中,以校准控制器

编辑:


最后一部分我错了,调用SetCalibrationPoint函数没有效果…

好的,下面是我使用注册表找到的结果。虽然有点长,但我已经开始工作了

使用regedit,您可以找到使用以下路径的DirectInput设备列表:Computer\HKEY\U CURRENT\U USER\System\CurrentControlSet\Control\MediaProperties\PrivateProperties\DirectInput

通过选择所需的设备,您最终会得到以下路径:Computer\HKEY\U CURRENT\U USER\System\CurrentControlSet\Control\MediaProperties\PrivateProperties\DirectInput\your\U device\U HERE\Calibration\0\Type\Axes。如果在该注册表中看不到任何其他内容,则表示尚未校准轴

使用C,您可以使用以下函数读取注册表中每个轴的校准值,并将其转换为字节数组:

Byte[] Axis = Registry.GetValue(registry + '0', "Calibration", "EMPTY") as Byte[];
可以更改每个轴的“0”

如果注册表不存在,请确保处理异常,这意味着您的路径无效,或者所需的轴以前从未校准过,因此使用默认值

在使用结果数组时,我还注意到了一些不同之处,这些值以一种奇怪的方式存储:

该数组的长度为12,校准的最小值存储在前4个字节中,然后4个中间字节存储校准的中间值,最后4个字节存储最大值

要读取每个部分的实际值,需要将每个部分的第二个字节乘以256,然后将其添加到第一个字节: int min=256*轴[1]+轴[0]

最后,如果您希望编写自己的校准值,只需使用以下函数Registry.SetValueregPath+'0',calibration,ByteArray

不要忘记更改每个轴的“0”,并在数组中使用相同的格式:

ByteArray[0] = (byte)(min % 256);
ByteArray[1] = (byte)(min / 256);
ByteArray[4] = (byte)(middle % 256);
ByteArray[5] = (byte)(middle / 256);
ByteArray[8] = (byte)(max % 256);
ByteArray[9] = (byte)(max / 256);