了解DirectInput
本节主要介绍Microsoft DirectInput的底层结构及它与Microsoft Windows消息系统的关系。
DirectInput的实现,可参照“应用DirectInput”。
DirectInput对象
一个DirectInput的专用输入实现由DirectInput对象组成,其支持IDirectInput8 COM接口,并通过DirectInputDevice对象访问每个输入设备的数据。每个DirectInputDevice对象依次包含设备对象,单独的控制器或转换器,如按键、按钮或者轴。设备对象在这里也被称为设备对象实例。
一个DirectInputDevice对象代表一个输入设备,如鼠标、键盘或游戏杆。在DirectInput的API中,游戏杆(joystick)是任意不同于鼠标或键盘的设备。有些硬件其实是不同类型的输入设备的组合,如带触摸板的键盘,就可以表示两个或以上的DirectInputDevice对象。力回馈设备可以通过一个单独的包含输入输出的游戏杆表示。
DirectInputDevice对象是实现IDirectInputDevice8接口的实例。应用程序可以通过IDirectInputDevice8::EnumObjects方法确定可用设备对象的数量及类型。个别的设备对象不会包装成代码对象,但在DIDEVICEOBJECTINSTANCE结构中有描述。
力回馈的效果以IDirectInputEffect接口来表示,该接口中包含了创建、修改、开始及停止等效果的方法。
所有的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就会在中键单击时报告为两次主键的单击即双击。
原文:Understanding DirectInput, DirectX SDK
© 2004 Microsoft Corporation. All rights reserved.
翻译:Room3rd@hotmail.com,2004-11-27