DirectInput简介
1. DirectInput的得名是因为它直接与设备驱动器通讯,对鼠标和键盘也就意味着立即响应硬件中断,而不是等待Windows发送消息证明已发生输入事件
2. DirectInput概念
(1) 设备
1. 键盘
2. 鼠标(触摸板、跟踪球以及相应的按键)
3. 游戏杆
设备可以指物理对象(如其驱动器)也可以指DirectInput创建的DirectInputDecive对象,当创建一个设备时,我们指获得一个指向IDirectInputDevice接口的指针
(2) 按钮和轴
3. 设置DirectInput:简单地调用DirectInputCreate函数就可以初始化DirectInput系统,此函数将返回一个指向IDirectInput接口的指针,然后就可以用此接口的方法列举设备并创建设备对象,这些设备对象是DirectInput的工作部分
4. 列举设备:一般不需要列举鼠标和键盘,游戏则属于另一种情况(EnumDevices方法)
5. 设置设备
(1) 创建设备:CreateDevice方法
选定一种输入设备或由用户选出一种后,接下来可以为其获取一个接口,继续工作之前需要设备的实例GUID,如果没有在列举时从DirectInput传给回调函数DIDEVICEINSTANCE结构的guidInstance成员中获取这一GUID,则需要使用预定义变量GUID_SysKeyboard或GUID_SysMouse
获得IDirectInput Device接口后,通常应立即查询IDirectInputDevice2结构并代替IDirectInput接口(对力反馈编程非常重要)
(2) 设备数据格式:从设备获取数据前,必须先设置其数据格式,这只是一个在设备的状态改变后获取数据包并与已知结构进行匹配的问题:SetDataFormat方法
设置自定义数据格式是相当复杂的,幸运的是,DirectInput开发者提供了四种预定义数据格式,可用于任何标准输入设备
(3) 获取设备信息(多种方法可以得到设备的各种信息)
列举设备物:EnumObjects方法
标识设备物:
1. 由偏移量标识:给设备设定数据格式后,每一对象都关联到此设备数据格式的特定位置处,此位置的字节偏移量是一种标识对应设备物的方法
2. 由实例号即ID标识:标识设备物的另一种方法是通过实例号(或ID)进行,它只是分配给各设备物一个序号,但不是GUID
3. 多数情况下,选择偏移量还是实例号来识别设备物是无关紧要的,但要获取输入数据,则应用偏移量来标识设备物
(4)设置和获取设备属性:SetProperty和GetProperty
(5)协作级别
(6)获得设备:取得设备的使用权并通知DirectInput程序想按设定的格式接受数据
6. 取得输入数据
(1)回顾在此之前应进行的步骤
1.创建设备
2. 设置协作级别
3. 设置数据格式
4. 设置设备属性
5. 获得设备
(2)两类数据
1. 缓冲区数据:当设备的缓冲区大小属性被设为大于0的值以后,这一系统开始运作,每当有输入事件发生时,都会有一个数据包被创建,但这些包被放在一个私有缓冲区中,而不是转换成消息的格式,在任何时刻都可以用GetDeviveData方法取出数据包
2. 立即数据:(整个设备或单个键的当前状态的“快照”),它存在于数据包中,数据包的格式即是设备设置的格式,调用GetDeviceState方法可以取得这些数据