C# 使用DirectX获取摇杆外设状态
要做使用摇杆来代替键盘控制某个状态的项目,了解了一下目前主流的两种获取方式,这里记录其中一种,以备以后查询;
第一种使用 winmm.dll
来获取摇杆状态
核心代码是 joyGetPosEx:
/// <summary>
/// 获取操纵杆位置和按钮状态
/// </summary>
/// <param name="uJoyID">只有一个手柄时传入0</param>
/// <param name="pji">JOYINFOEX 结构体</param>
/// <returns>0则是获取到了摇杆</returns>
[DllImport("winmm.dll")]
public static extern int joyGetPosEx(int uJoyID, ref JOYINFOEX pji);
第二种使用Microsoft.DirectX
来获取摇杆状态
本文主要讲使用DirectX遇到的一些坑
1.导入对应的dll库
一共需要两个库
Microsoft.DirectX.dll
Microsoft.DirectX.DirectInput.dll
这个库放到本文的最后,需要的可以下载
2.导入对应的模块代码
这里已经将代码封装好了
JoyKey - 定义了一些键位的类
Joystick - 获取摇杆状态的类
JoyManager - 将键位状态进行处理和分发出去的类
代码也一起打包放到了本文的最后,需要的可以下载
3.在代码中使用封装好的模块代码
KeyValueChanged - 订阅键位改变事件
Connect - 连接摇杆
Release - 释放摇杆
4.遇到的问题
4.1 wpf项目无法使用的问题
代码会报错,这是由于DirectX是基于System.Windows.Forms开发的,所以还需要导入
System.Windows.Forms库,右键项目引入
4.2 程序卡死问题
代码编译通过后,运行程序会卡死,因为我们使用的DirectX SDK是.NET 2.0开发的,所以会出现在4.0下会出现不兼容的情况,具体表现为开始调试以后应用卡在Load事件之后就不再执行,为了能兼容,我们需要在App.config中添加如下的语句(没有App.config? 请在项目中添加新建项)来完成对老版本dll的兼容。
useLegacyV2RuntimeActivationPolicy="true"
4.3 调试中断问题
启动调试会报一个“正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。”的异常,点击继续其实应用还是可以正常调试的,造成这种现象的原因是因为应用中使用的DirectX SDK是基于.NET 2.0版本开发的,在全新的.NET 4.0环境下很多东西改掉了所以才出这个警告,我们可以通过选择调试-异常-Managed Debug Assisants中勾掉LoaderLock来忽略这个警告
5.成功执行
这时就能看到成功的获取到了摇杆的状态了