C - 手柄模拟鼠标控制
虽然Flash中不支持对游戏手柄进行编程,但我们可以换种方法,做一个辅助程序(外挂? ),将手柄中的操作事件转换为Flash中可接受的键盘与鼠标操作事件,这样不就可以使用游戏手柄来玩Flash游戏了吗?!于是,上网查了相关资料,但却发现只有C 方面的案例,而C#一个也找不,这不打紧,自己动手,丰衣足食。
(注:类似这样的功能,网络已有现成的软件,是一个日本人开发的,叫JoyToKey)
对游戏手柄进行操作,大概有两种方式:采用系统API或者使用DirectInput操作游戏手柄设备。(也许还有其它方式,但我的知识范围有限,其它方式就不得而知了)
采用系统API是一种最简单的方式,因为系统已帮我们封装好了所有细节,我们只要在程序中定时取得游戏手柄设备的状态就可以了(轮循)。 操作游戏手柄(杆)的API有以下几个: 函数名称 函数说明
joyGetNumDevs 获取当前系统支持的游戏设备数量 joyGetDevCaps 查询获取指定的游戏杆设备以确定其性能 joySetCapture 向系统申请捕获某个游戏设备并定时将该
设备的状态值通过消息发送到某个窗口 joyReleaseCapture 释放对某个游戏设备的捕获 joyGetPos 获取游戏设备的坐标位置和按钮状态 joyGetPosEx 获取游戏设备的坐标位置和按钮状态 joyGetThreshold 查询指定的游戏杆设备的当前移动阈值 joySetThreshold 设置指定的游戏杆设备的移动阈值
其中,根据调用不同的方法又可分为两种方式。 1)被动方式:
调用joySetCapture方法,向系统申请对某个游戏手柄的捕捉,如果成功申请,系统将会定时将此游戏手柄的状态信息通过消息方式通知到我们的某个窗口上。
2)主动方式:
即是根据我们自己的需要,按需调用joyGetPos或joyGetPosEx方法查询获取某个游戏手柄的当前状态。
而在本篇中,我们要讲解的只是“被动方式”。 joySetCapture方法的C#定义原型如下:
///
/// 向系统申请捕获某个游戏杆并定时将该设备的状态值通过消息发送到某个窗口
///
///
///
/// ///
///
public static extern int joySetCapture(IntPtr hWnd, int uJoyID, int uPeriod, bool fChanged);
当我们调用此方法向系统申请捕获某个游戏手柄后,如果成功,则返回JOYERR_NOERROR(值为0),否则返回其它值的话表示申请失败。并且在不再需要捕获游戏手柄时要记得调用joyReleaseCapture方法释放捕捉。
如果申请成功,系统将会定时(根据uPeriod的值决定时间的长短)将游戏手柄的状态以消息包形式发送到hWnd对应的窗口界面。所以我们必须要在程序中处理对应的消息(如重写WndProc方法进行处理)。
并且根据不同的uJoyID值,系统发送的消息号又会有所不同,如对于JOYSTICKID1系统将会分别发送以下消息包:
消息号说明MM_JOY1MOVE当手柄的位置已变动或按了某些按钮时,将会发送此消息包。MM_JOY1BUTTONDOWN当手柄的A,B,C,D四个按钮中的一个或多个正被按下时,将会发送此消息包。MM_JOY1BUTTONUP当手柄的A,B,C,D四个按钮中的一个或多个正被弹起时,将会发送此消息包。
而对于JOYSTICKID2 系统发出的消息包分别为MM_JOY2MOVE、MM_JOY2BUTTONDOWN、MM_JOY2BUTTONUP!
并且要注意!不管你有没有按游戏手柄上的按钮,系统也会定时发送MM_JOYXMOVE消息!! 怎样判断按了哪些键?
在消息包中,游戏手柄的状态信息(按钮状态)分别存储在消息包中的WParam与LParam参数。 1)WParam参数:
对于游戏手柄来说WParam存储的是除了上下左右四个方向键之外的所有按钮中当前被按下的按钮值,它的值是一个复合值。如它的值为JOY_BUTTON1 | JOY_BUTTON2时,就表明按下的按键是1号和2号按钮。
注意:对于MM_JOYXBUTTONDOWN与MM_JOYXBUTTONUP两个消息,用于判断的按钮值是不同于MM_JOYXMOVE的按钮值!! 2)LParam参数:
此参数存储的是游戏手柄的坐标参数,并且此参数的高16位存储的是Y坐标值,低16位存储的是X坐标值。
而对于游戏手柄来说,判断上下左右四个方向键有没有被按下就是通过此参数进行判断的。如果当四个方向键都没有被按下时,表示当前游戏手柄处于中心坐标中!也就是X,Y坐标都是在中心点位置上,而当某些方向键被按下时,X,Y坐标将根据所按的键向对应方向偏移。如当按了向右键,则X坐标向右偏移,Y坐标保持在中心点位置,而如果按了右、上两个方向键同时按下,则X坐标向右偏移,Y坐标向上偏移。所以我们可以根据LParam参数取得X,Y坐标的值,然后再根据其中心点来判断。参考代码如下:
///
/// 获取X,Y轴的状态 ///
///
private void GetXYButtonsStateFromLParam(int lParam, ref JoystickButtons buttons) {
//处理X,Y轴
int x = lParam & 0x0000FFFF; //低16位存储X轴坐标
int y = (int)((lParam & 0xFFFF0000) >> 16); //高16位存储Y轴坐标(不直接移位是为避免0xFFFFFF时的情况)
int m = 0x7EFF; //中心点的值
}
if (x > m) {
buttons |= JoystickButtons.Right; }
else if (x < m) {
buttons |= JoystickButtons.Left; }
if (y > m) {
buttons |= JoystickButtons.Down; }
else if (y < m) {
buttons |= JoystickButtons.UP; }
好了,对游戏手柄的“被动方式”编程就讲解完成了,剩下的就是要怎么利用游戏手柄来实现模拟键盘或鼠标的操作了??
回顾“被动方式”开发
在C#对游戏手柄的编程开发-API篇(1)这篇文章中我们介绍了“被动方式”的开发。在此方式下,我们的程序只扮演一个消息接收者。系统会定时告诉我们某个游戏手柄当前的状态,我们的程序接收到后再按实际需要进行处理即可。但如果你是一个细心的人,你会发现如果直接按消息事件处理的话会存在一个问题,如我们按下某个键(比如向上的方向键)然后放开时,对于我们“人”来说,我们按下与弹起的这两个动作应该只是说明我们只点击这个按钮一次。但对于系统来说,它 …… 此处隐藏:1716字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [学前教育]MC9S12XS256RMV1 xs128芯片手册4
- [学前教育]安东尼语录经典语录
- [学前教育]e级gps控制测量技术设计书
- [学前教育]苏教版2022-2022学年八年级下学期期末
- [学前教育]装修公司推广 营销
- [学前教育]家政服务合同(完整版)
- [学前教育]湖北省2016届高三联考语文试题
- [学前教育]爱立信无涯学习系统LTE题库1-LTE基础知
- [学前教育]揭秘大众柴油车作弊软件原理
- [学前教育]人才流失原因及对策分析
- [学前教育]房屋建筑施工工程劳务分包合同
- [学前教育]国际贸易实务试卷A卷09.6
- [学前教育]校园废品回收活动计划方案书范文格
- [学前教育]电大成本会计试题及答案
- [学前教育]大学物理实验 华南理工出版社 绪论答案
- [学前教育]爱丁堡产后抑郁量表
- [学前教育]液压冲击的危害、产生原因与防止方法(
- [学前教育]学生工作总结高一学生期中考试总结_020
- [学前教育]人民医院医疗废物管理规章制度大全
- [学前教育]阳光维生素的巨大抗癌潜能阅读题答案.d
- 马云在云锋基金江苏论坛闭幕式的发言
- 试论小学体育教育中的心理健康教育-教
- 语文A版一年级下册《语文乐园一》教学
- 2021四川大学物理化学考研真题经验参考
- [人教A版]2015-2016学年高中数学 第二
- 终端网点销售返利协议书
- 江苏省2015年眼科学主治医师青光眼考试
- 2017年部编人教版八年级语文上册教案
- 十一中学七年级英语上册Unit7Howmuchar
- 以赛促教的创新性实验教学机制建设实践
- 平凉市崆峒区2015七年级下生物期末试题
- 琶洲(地块五)A、B塔楼1、2#塔吊基础
- 一级医院工作制度与人员岗位职责
- 2018北京西城区高三二模理科数学试题及
- 炒股密码线技术 - 图文
- 职高学生生涯发展辅导教案
- 语文人教版四年级上册8 世界地图引出的
- 最新最新人教版二年级上册全册数学教案
- 2017高考英语全国2卷精彩试题(有问题
- 普通心理学笔记




