问题  使用slimDX使Dpad正常工作

101

成员
已加入
2020年12月14日
留言内容
20
编程经验
Beginner
我使用slimdx作为directx输入,我可以使用按钮和操纵杆,但是如果向左按d垫,则无法使dpad起作用,如果向右按,则将光标向左移动;如果向右按,则将光标向右移动,依此类推
 

附件

  • code.txt
    3.8 KB · Views: 5

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
我以前没有使用过任何类型的DX,但是我测试了您的代码,它对我有用。我的游戏手柄有一个用于dpad的切换按钮和一个左模拟摇杆,如果您也有一个按钮,请检查您是否从其中一个得到响应。

代码中存在一些不会影响操作的问题,但我会提及它们:
  • 您在构造函数中(第2行,没有使用return)有多余的GetSticks调用,并且表单加载。
  • 由于这是非托管对象,因此您应确保将其处置,在窗体关闭时的输出将显示4个未处置的对象。
  • 按下/向上按钮的逻辑不正确,它仅在按下并重复按钮时起作用,而不像一次按下那样 &向上,请参阅所附示例以了解如何解决该问题。
Nuget已将SlimDX标记为已弃用(最新更新时间为2013年),建议使用SharpDX替代。 SharpDX较新且非常相似,它也已在2019年停止开发/维护,但我还没有找到其他库。
我已经为使用SharpDX的示例表单附加了代码(从Nuget安装SharpDX.DirectInput)。
 

附件

  • code2.txt
    3.3 KB · Views: 5

101

成员
已加入
2020年12月14日
留言内容
20
编程经验
Beginner
我以前没有使用过任何类型的DX,但是我测试了您的代码,它对我有用。我的游戏手柄有一个用于dpad的切换按钮和一个左模拟摇杆,如果您也有一个按钮,请检查您是否从其中一个得到响应。

代码中存在一些不会影响操作的问题,但我会提及它们:
  • 您在构造函数中(第2行,没有使用return)有多余的GetSticks调用,并且表单加载。
  • 由于这是非托管对象,因此您应确保将其处置,在窗体关闭时的输出将显示4个未处置的对象。
  • 按下/向上按钮的逻辑不正确,它仅在按下并重复按钮时起作用,而不像一次按下那样 &向上,请参阅所附示例以了解如何解决该问题。
Nuget已将SlimDX标记为已弃用(最新更新时间为2013年),建议使用SharpDX替代。 SharpDX较新且非常相似,它也已在2019年停止开发/维护,但我还没有找到其他库。
我已经为使用SharpDX的示例表单附加了代码(从Nuget安装SharpDX.DirectInput)。
您提供的代码没有错误,但没有任何动作,使用我的代码,我能够用操纵杆移动鼠标光标,并且如果光标在按钮上,则可以通过游戏手柄按钮来选择它代码中的差异,但我尝试将其更改为适合我需要的方法无法正常工作,请帮助
 

附件

  • code3sharpdx.txt
    3.5 KB · Views: 2

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
用我的代码,我能够用操纵杆移动鼠标光标
现在我很困惑,在开幕词中你说 您的代码 无法使用dpad移动鼠标。现在呢?那么您的代码有什么问题呢?
您提供的代码没有错误,但没有采取任何措施
isnt working
"Isn't working"不足以说明任何事情。在 我的代码 添加了一些Console.Writelines进行调试,您在“即时窗口”中看到了什么?您是否为表单加载/关闭事件和计时器滴答事件连接了事件? (如果使用该按钮,则单击按钮)是否取消了输出X / Y值的第63行的注释?
 

101

成员
已加入
2020年12月14日
留言内容
20
编程经验
Beginner
是的,我正确连接了事件和计时器,并尝试取消注释第63行,但是为什么要编写控制台书写行?我正在使用Windows窗体?当我取消注释窗口中的第63行时,什么都没有出现?当我运行时,我有一个带有2个按钮的窗体代码苗条dx,您可以使用操纵杆移动鼠标光标,并且鼠标停留在窗口范围内;当光标位于按钮上方时,可以使用游戏手柄单击它,但是当我运行它时,您的代码不执行任何操作不会移动鼠标或保持它在窗口范围内,或者允许我单击任何按钮,您的代码完全不起作用
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
你为什么要写控制台writeline
按照说明在Visual Studio的“即时Windows”中查看调试信息。我看到了用于设备检测的输出,并单击了行为,如果需要,还可以查看X / Y信息。
您的代码完全不起作用
在我看来,与您的作品(带有怪癖)相同,无论是移动还是单击。
 

101

成员
已加入
2020年12月14日
留言内容
20
编程经验
Beginner
我用console.writeline无法获得任何信息x,y,只是我的常规表单窗口出现了,但是如果我将Debug.Log放在调试器中可以看到x,y值,但是x,y值不会随着操纵杆而改变我尝试重新安装SharpDX的动作相同的结果
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
我有选择"将所有输出重定向到立即窗口"如果未启用,则输出将转到“输出窗口”。
我可以在调试器中看到值x,y
就是这样请记住,每个计时器刻度线都有一条输出线,默认情况下为每秒10条线,尝试向左/向右/向上/向下按住dpad一段时间,以查看这些方向的重复值,这将显示边界值,我的将触发值恰好在+/- 100的设定范围内。 if语句是为了避免在没有移动的情况下将光标设置为大量的轮询时间(我的键盘上的X 0 Y 0)。
 

101

成员
已加入
2020年12月14日
留言内容
20
编程经验
Beginner
我发现了我要使用2.4 GHz无线遥控器的问题,该遥控器带有USB插头,该手柄是游戏手柄的接收器,不能与您的代码一起使用,而USB有线游戏手柄可以与您的代码一起使用,我是我不确定为什么会有所不同吗?
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
Line 40 at input.GetDevices, try changing first argument to DeviceClass.GameControl, which is the comparable type and value you used in SlimDX. In code I posted I used DeviceType, which is a more specialized enum, I'm sure you can find a DeviceType value that works for the wireless pad also. Here you can see a comparison table of those enums for both libraries:
1609501940999.png
1609501954466.png


奇怪的是,我的USB游戏板也被检测为DeviceType.Joystick(和.ControlDevice),但未被检测为DeviceType.Gamepad。  :)
 

101

成员
已加入
2020年12月14日
留言内容
20
编程经验
Beginner
我通过将DeviceType更改为游戏板(而不是操纵杆)而按下了游戏板按钮,但用于移动光标的Dpad无效,我尝试了所有其他设备类型仍然无法移动鼠标光标,但我不知道为什么
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,073
地点
挪威
编程经验
10+
DeviceClass.GameControl 与您在SlimDX中使用的相同。

"doesn't work"/"not working"不是准确的描述。因此,当您尝试输出X / Y时,没有输出,或者只有0/0?如果得到0/0并将其过滤掉,则不会得到任何输出?

我还在这里附上更新的代码,其中包括:
  • 对按钮使用缓冲状态更新,这使操作变得更加容易(并且仍对dpad使用当前状态) 缓冲数据和即时数据
  • 删除mouse_event并根据MS说明文件使用SendInput API"注意此功能已被取代。请改用SendInput。"
The buffer may make your debugging easier because it will report all state changes and not just current state. Try uncomment line 68 (Debug.WriteLine(update.ToString()); in CheckBufferAndCurrentState) here and use dpad directions, what do you see?
 

附件

  • code3.txt
    4.2 KB · Views: 2
最佳 底部