2024年4月28日发(作者:)

虽然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#定义原型如下:

///

/// 向系统申请捕获某个游戏杆并定时将该设备的状态值通过

消息发送到某个窗口

///

/// 窗口句柄

/// 指定游戏杆(0-15),它可以是

JOYSTICKID1或JOYSTICKID2

/// 每隔给定的轮询间隔就给应用

程序发送有关游戏杆的信息。这个参数是以毫妙为单位的轮询频率。

/// 是否允许程序当操纵杆移动一

定的距离后才接受消息

///

[DllImport("")]

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!