C# 使用DirectX获取摇杆外设状态

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.成功执行

这时就能看到成功的获取到了摇杆的状态了
在这里插入图片描述

文件链接

点击下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值