转:https://www.cnblogs.com/qyit/archive/2011/11/21/2257687.html
一个手柄/键盘映射程序,无外乎就四部分:一、界面;二、接收;三、处理;四、输出。
界面就不多说了。
接收,就是接收手柄的输出。这部分有多种方法,比如windows API和DirectX,这里我们选前者。
处理,就是将接收到的数据映射为输出数据。
输出,就是向操作系统发送假的键盘事件,从而完成映射过程。
接收部分:
那么,我们先来进行知识的准备。为了完成接收部分,我们需要了解和手柄相关的windows API。其中常用的较重要的函数如下:
joyGetDevCaps 查询指定的游戏杆设备以确定其性能
joyGetNumDevs 返回系统支持的游戏杆设备的数量
joyGetPos 查询指定的游戏杆设备的位置和活动性
joyGetPosEx 查询一个游戏杆设备的位置和它的按扭状态
joyGetThreshold 查询指定的游戏杆设备的当前移动阈值
joyReleaseCapture 释放由JoySetCapture函数设置的在指定游戏杆设备上的捕获
joySetCapture 发送一个游戏杆消息到指定的窗口
joySetThreshold 设置指定的游戏杆设备的移动阈值
要使用这几个API,需要连接winmm.lib,包含mmsystem.h头文件。
如果仅制作基本的映射功能,那么我们并不需要用到全部的函数。主要使用的是这个:
MMRESULT joyGetPosEx(UINT uJoyID, LPJOYINFOEX pji)
这个函数可以主动取得游戏杆信息。
参数uJoyID是指手柄的ID,对于单手柄编程,填写JOYSTICKID1即可。
参数pji是一个指向JOYINFOEX型结构体的指针。JOYINFOEX的定义如下:
typedef struct joyinfoex_tag { DWORD dwSize; /* size of structure */ DWORD dwFlags; /* flags to indicate what to return */ DWORD dwXpos; /* x position */ DWORD dwYpos; /* y position */ DWORD dwZpos;