C# 根据代码校准游戏控制器
我期待从一个C WPF应用程序复制一个校准程序。互联网上也有类似的应用程序,例如: 以及: 但是,由于要求您为每个轴选择最小值、中间值和最大值,因此该过程非常繁琐 我有自己的操纵杆板,windows将其识别为游戏控制器。我可以使用DirectInput或任何其他库读取其值。当使用这两个应用中的一个来校准我的操纵杆时,我实际上可以在使用DirectInput轮询值时获得结果。肯定有一种方法可以通过代码来实现 我的目标是开发一个应用程序来同时校准多个轴。我相信DirectInput可以处理这种任务,或者windows注册表将它们存储在某个地方。可悲的是,在谷歌上搜索了几个小时后,没有足够的结果。请证明我错了 编辑: DirectInput API中有DeviceProperty.GetCalibrationPoints和DeviceProperty.SetCalibrationPoints函数,但我不知道如何使用它们 这是我的建议C# 根据代码校准游戏控制器,c#,.net,wpf,window,C#,.net,Wpf,Window,我期待从一个C WPF应用程序复制一个校准程序。互联网上也有类似的应用程序,例如: 以及: 但是,由于要求您为每个轴选择最小值、中间值和最大值,因此该过程非常繁琐 我有自己的操纵杆板,windows将其识别为游戏控制器。我可以使用DirectInput或任何其他库读取其值。当使用这两个应用中的一个来校准我的操纵杆时,我实际上可以在使用DirectInput轮询值时获得结果。肯定有一种方法可以通过代码来实现 我的目标是开发一个应用程序来同时校准多个轴。我相信DirectInput可以处理这种任务,
我尝试像这样获取校准点: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);