DirectInput(zz)

(一)介绍DirectInput

DirectInput是一套输入设备的API,其中包括鼠标、键盘、手柄及其他游戏控制器,如力回馈(输入/输出)设备。

本节对DirectInput的功能作了简要说明,并简要介绍如何创建一个DirectInput应用程序。主要包含以下内容:

  • DirectInput的能力
  • 从DirectInput开始

要全面理解DirectInput是如何工作的,请参照“理解DirectInput”。
要逐步学习使用DirectInput API,请参照以下章节:

使用DirectInput

DirectInput 指南

DirectInput的能力

除了为那些不被Win32 API所支持的设备提供服务外,DirectInput利用直接访问硬件驱动的方式来获取输入,这比windows消息的访问方式更快。

即使应用程序处于后台,DirectInput也可以应用程序获取输入设备数据。同样,对任意类型的输入设备都提供完全支持,其中包括力回馈设备。
通过action映射,应用程序不需要知道具体使用的是什么类型的设备就可以获取输入数据。
DirectInput扩充的服务及改良的性能使它成为windows下的游戏、仿真以及实时交互极其有价值的工具。
然而对于使用键盘作文本输入或利用鼠标来导航的应用程序来说,DirectInput不会提供更多优势。更多信息,可参照 “与windows交互”。

从DirectInput开始

这一节是一个关于如何建立和使用DirectInput样例应用程序的概览。

要获取细节和这些步骤的例子,参见“使用DirectInput”和“DirectInput指南”。

备注:要了解DirectInput,需要理解以下术语:
DirectInput对象:DirectInput接口的根对象
设备:键盘、鼠标、手柄、或者其他输入设备。
DirectInputDevice对象:代码表现的键盘、鼠标、手柄、或者其他输入设备。
Device对象:代码表现的键,按钮,触发器等等输入设备对象上的对象,也可以称作设备对象实例。

下面的步骤描述了一个简单的DirectInput实现,主要描述了应用程序如何接管创建设备并从每种设备(按钮,轴等等)生成各种数据等工作。

  1. 创建DirectInput对象。你可以使用这个对象来枚举设备并且创建DirectInput设备对象。
  2. 枚举设备。如果你只使用系统鼠标和键盘,那么这步不是很重要。 要确定用户系统上的其他设备,就需要用DirectInput枚举出来。每次DirectInput找到了你需要的设备之后,你可以检查这个设备的能力, 可以获取一个关于设备的唯一标识,利用这个标识创建一个DirectInput设备对象来表现这个设备。
  3. 为每个你想使用的设备创建DirectInputDevice对象。这一步需要使用上一步枚举出来的设备唯一标识。而对于系统的鼠标或者键盘,只需使用标准的GUID。
  4. 建立设备,对于每个设备,首先要设置一个协作的级别,它决定了与其他应用程 序或系统共享这个设备的方式。同时也要设置数据格式来鉴别来自信息包的设备对象,例如按钮还是轴。如果你想获取缓冲数据(事件处理优先级高于实时状态的情 况),那么也需要设置缓冲大小。至此你已经可以随意获取关于设备的信息了,可以进一步的控制应用程序的行为。你还可以设置一些属性例如手柄轴返回的值的范 围。
  5. 获取设备。此时你通知DirectInput,你已经准备从设备获取数据了。
  6. 获取数据。在一个规律的时间间隔里,典型是在每次消息循环或者渲染循环时,既可以获取每个设备的即时状态也可以获取发生在上一次取回的事件记录。如果你愿意,还可以让DirectInput在事件发生时通知你。
  7. 对数据做出响应。应用程序可以对按钮和轴的状态或者事件(如一个键被按下或者松开)做出响应。
  8. 关闭DirectInput。在退出之前,应用程序应该归还所有的设备并且释放他们,然后释放DirectInput对象。

这并不是实现DirectInput的唯一途径。要想利用林林总总的已有的和未来的输入设备的优点,并且简单化用户的配置,你可以使用action映射(Action Mapping)。

要为一个设备设置action映射,你需要让DirectInput决定为每个应用程序 行为使用何种设备对象。例如,一个赛车游戏中通常要指定一个速度控制器,通常用游戏控制器的y轴。利用action映射,你可以创建一个叫做 AXIS_THROTTLE的action,然后让DirectInput指派这个action设备到适合的轴上去。当获取事件时,你利用关联的 action来定位他们,这比利用设备对象直接生成他们更好。

更详细的信息,参见Action Mapping.

2005年11月9日译, 不得用于商业用途。
outiejun@yeah.net


Introduction to DirectInput - Microsoft DirectX 9.0 SDK Update (October 2005)

 

本节主要介绍Microsoft DirectInput的底层结构以及它与Microsoft Windows消息系统的关系。

DirectInput对象

与Windows交互

关于DirectInput实现的实战信息,可参照“使用DirectInput”。

DirectInput对象

一个专用于输入的DirectInput的实现由DirectInput对象(它支持 IDirectInput8 COM接口)和一个DirectInputDevice对象(为每个输入设备提供数据)组成。每个DirectInputDevice对象依次包含设备对 象(device objects),它们是单独的控制器或转换器,如按键、按钮或者轴。设备对象在这里也被称为设备对象实例(device object instances)。
每个DirectInputDevice对象代表一个输入设备,如鼠标、键盘或手柄。在 DirectInput的API中,手柄(joystick)是指任意不同于鼠标或键盘的设备。一个硬件其实是不同类型的输入设备的组合,如带触摸板的键 盘,可以表示成两个或两个以上的DirectInputDevice对象。强力回馈设备可以通过一个单独的包含输入输出的游戏杆表示。

DirectInputDevice对象是实现IDirectInputDevice8 接口的实例。应用程序可以通过IDirectInputDevice8::EnumObjects方法确定可用设备对象的数量和类型。个别的设备对象没有 包装成代码对象,但在DIDEVICEOBJECTINSTANCE结构中有描述。
所有的DirectInput接口都包含在ANSI及Unicode的版本中,编译时,如果已经定义了UNICODE,就会使用UNICODE版本。

与Windows交互

由于DirectInput直接与设备驱动进行交互,所以它既可以抑制也可以忽略Windows的鼠标及键盘消息。同样也可以忽略控制面板中键盘及鼠标的设置。尽管如此,它还是会使用游戏杆或其他游戏控制器的标准设置。
DirectInput 不识别键盘的“字符重复”的设置。当使用缓冲数据的时候,DirectInput会把每一次的按下与释放看作一个单独的事件,而且不产生字符重复的序列。 当使用立即数据的时候,DirectInput就只会关心当前按键的物理状态,而不是Windows所解释出的键盘事件。

DirectInput不实现字符转换或变换。例如,SHIFT键与其他键将同等对待,而不是另外一个按键的修饰符。不管用户的系统语言设置是什么,按键总会返回相同的标识。
Windows 2000中,, 以独占模式获得键盘的话,将阻止其他后续的应用程序接收键盘数据。

由于DirectInput直接访问鼠标驱动,因此它将绕过Windows鼠标数据解释子系统。依靠鼠标光标导航的应用程序应该继续使用标准的Windows鼠标消息及Microsoft Win32函数。

当在独占模式下使用系统鼠标时,DirectInput会抑制鼠标消息,因此Windows将不能显示标准的鼠标图标。

DirectInput会忽略控制面板中的设置,如加速、按钮交换。但DirectInput会自行识别驱动中的设置。例如,如果用户有一个三键鼠标,并使用驱动实用工具把中键设置为双击的快捷方式,DirectInput就会在中键单击时报告为两次主键的单击。

2005年11月9日译, 不得用于商业用途。
outiejun@yeah.net

Understanding DirectInput - Microsoft DirectX 9.0 SDK Update (October 2005)

这一节是一个实现Microsoft DirectX的向导,包含以下内容:

创建DirectInput
DirectInput设备枚举

更详细的内容,参见“理解DirectInput”。

相关的信息,参见:
DirectInput设备
DirectInput设备数据
Action映射
力反馈

创建DirectInput

任何Microsoft DirectInput应用程序的第一步就是获取IDirectInput8接口。可以简单的调用DirectInput8Create函数来实现。
你可以创建单一一个DirectInput对象,直到应用程序终止再释放它。

DirectInput设备枚举

DirectInput可以查询系统所有的输入设备,决定他们是否已经连接,随后返回关于他们的信息。这个过程叫做枚举。
如果你的应用程序仅使用了标准的键盘或鼠标,或者二者都有,那么你不需要作枚举。在Creating a DirectInput Device一节里会解释:在调用CreateDevice函数时你可以预定义全局变量来保存设备。

下面的代码例子中,lpdi是一个指向IDirectInput8接口的指针,利用它创建一个键盘设备:

 

LPDIRECTINPUTDEVICE8 lpdiKeyboard; 

lpdi
-> CreateDevice(GUID_SysKeyboard,  & lpdiKeyboard, NULL); 

 

IDirectInput8::CreateDevice的第一个参数是一个用于识别创 建的设备类型的实例GUID(Instance GUID)。Microsoft DirectInput有两个预定义的GUID:GUID_SysMouse 和GUID_SysKeyboard,分别表示系统鼠标和键盘。你可以传给IDirectInput8::CreateDevice函数两个参数之一。但 是全局变量GUID_Joystick不可以传入,因为它是一个产品GUID(Product GUID),不是实例化的GUID(Instance GUID)。

备注:如果计算机安装有一个以上的鼠标,来自他们所有的输入将被组合构成系统设备。键盘也是如此。

DirectInput提供了其余4个预定义的GUID用于测试。

GUID_SysKeyboardEm

GUID_SysKeyboardEm2

GUID_SysMouseEm

GUID_SysMouseEm2


将他们传给IDirectInput8::CreateDevice函数后,函 数将通过仿真层获得访问系统鼠标或者键盘的权限,level1或者是level2。这些GUID总是代表系统鼠标或者键盘。他们是 GUID_SysKeyboard 和GUID_SysMouse的别名,因此他们不会被EnumDevices函数或者EnumDevicesBySemantics函数枚举,除非设置了 DIEDFL_INCLUDEALIASES标志。

对于系统鼠标或者键盘以外的设备,使用的是被 IDirectInput8::EnumDevices 或者IDirectInput8::EnumDevicesBySemantics实例化后返回的GUID。一个设备的实例GUID永远是同一个值。你可 以允许用户从枚举的列表中选择一个设备,然后保存GUID到一个配置文件里,以便在以后的会话中重复利用。

2005年11月10日译, 不得用于商业用途。
outiejun@yeah.net

Using DirectInput - Microsoft DirectX 9.0 SDK Update (October 2005)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值