(一)介绍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实现,主要描述了应用程序如何接管创建设备并从每种设备(按钮,轴等等)生成各种数据等工作。
-
创建DirectInput对象。你可以使用这个对象来枚举设备并且创建DirectInput设备对象。
-
枚举设备。如果你只使用系统鼠标和键盘,那么这步不是很重要。
要确定用户系统上的其他设备,就需要用DirectInput枚举出来。每次DirectInput找到了你需要的设备之后,你可以检查这个设备的能力,
可以获取一个关于设备的唯一标识,利用这个标识创建一个DirectInput设备对象来表现这个设备。
-
为每个你想使用的设备创建DirectInputDevice对象。这一步需要使用上一步枚举出来的设备唯一标识。而对于系统的鼠标或者键盘,只需使用标准的GUID。
-
建立设备,对于每个设备,首先要设置一个协作的级别,它决定了与其他应用程
序或系统共享这个设备的方式。同时也要设置数据格式来鉴别来自信息包的设备对象,例如按钮还是轴。如果你想获取缓冲数据(事件处理优先级高于实时状态的情
况),那么也需要设置缓冲大小。至此你已经可以随意获取关于设备的信息了,可以进一步的控制应用程序的行为。你还可以设置一些属性例如手柄轴返回的值的范
围。
-
获取设备。此时你通知DirectInput,你已经准备从设备获取数据了。
-
获取数据。在一个规律的时间间隔里,典型是在每次消息循环或者渲染循环时,既可以获取每个设备的即时状态也可以获取发生在上一次取回的事件记录。如果你愿意,还可以让DirectInput在事件发生时通知你。
-
对数据做出响应。应用程序可以对按钮和轴的状态或者事件(如一个键被按下或者松开)做出响应。
-
关闭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)
分享到:
相关推荐
本文将深入探讨如何使用C#语言,结合DirectInput技术来实现对手柄的操作,包括振动功能。 DirectInput是Microsoft DirectX库的一部分,主要用于获取高级游戏设备的数据,如键盘、鼠标以及游戏手柄等。它提供了一个...
DirectInput是Microsoft DirectX库的一部分,主要用于游戏和其他实时交互应用程序,提供了一种高效的方式来获取键盘、鼠标和游戏控制器(如手柄)的输入。在本文中,我们将深入探讨如何使用DirectInput进行手柄编程...
在本文中,我们将深入探讨如何使用SharpDX.DirectInput.dll库在VB.NET环境下实现手柄按键检测的例程,以及为何这种方式能提供更快的按键获取速度。SharpDX是一个强大的开源库,它为.NET开发者提供了直接访问 DirectX...
DirectX和DirectInput是微软开发的一组API,用于在Windows操作系统上进行低级硬件访问,尤其是与游戏相关的输入设备如键盘、鼠标以及手柄等。DirectInput提供了比系统默认输入处理更高级别的控制,允许开发者获取更...
1. **初始化DirectInput**:在程序启动时,需要初始化DirectInput实例,这通常涉及到设置DirectInput版本、创建DirectInput对象,并检查系统是否支持DirectInput。 2. **设备枚举**:通过DirectInput的枚举功能,...
DirectInput是Microsoft DirectX SDK中的一个组件,主要用于游戏和其它高级输入设备的交互。它提供了一种高效、低延迟的方式,让应用程序可以直接与硬件设备通信,包括键盘、鼠标、游戏手柄等,从而获取精确的输入...
DirectInput是Microsoft DirectX SDK中的一个组件,主要用于游戏和其他交互式应用程序获取输入设备数据,如键盘、鼠标、游戏控制器等。这个VC++项目包含了对DirectInput的详细实现,并且附带了注释,使得开发者能够...
DirectInput是Microsoft DirectX API的一部分,主要用于游戏开发,它提供了一种高效、低延迟的方式来获取输入设备,如键盘、鼠标和游戏控制器的数据。本压缩包"DirectInput-Keyboard.zip"聚焦于如何利用DirectInput...
DirectInput是一种在Windows平台上用于游戏输入设备编程的API,它属于Microsoft DirectX的一部分。DirectInput的主要目的是为游戏开发者提供一种高效、低延迟的方式来处理各种输入设备,包括键盘、鼠标以及游戏方向...
而DirectInput是微软的DirectX的一部分,主要用于游戏和高精度输入设备的控制,它能直接从硬件获取输入信息,避免了消息队列的延迟,提供更实时的响应。本文将详细介绍如何使用MFC结合DirectInput来实现键盘消息的...
在Windows平台下使用DirectInput8接口,对joystick进行编程。 共2个文件:《DirectInput8开发手册》和Joystick.cpp(代码) 编译器:Visual Studio 2017 主要包含头文件: #include <dinput.h> #include <dinputd.h>
本教程主要关注Direct3D中的字体渲染和DirectInput的使用。 一、Direct3D字体渲染 在Direct3D中,字体渲染通常涉及到Direct3D文本的创建、绘制和更新。Direct3D本身并不直接提供内建的字体系统,但可以通过使用...
DirectInput是一种早期由微软开发的游戏输入API,它属于DirectX的一部分,主要负责高效地获取来自游戏控制器(如键盘、鼠标)的输入数据。在MFC(Microsoft Foundation Classes)框架下,通常我们会创建基于对话框的...
DirectInput是微软Windows平台上用于游戏输入设备编程的一个API,它为开发者提供了低级访问硬件的能力,包括键盘、鼠标以及各种游戏控制器(如操纵杆、游戏手柄等)。MFC(Microsoft Foundation Classes)是微软提供...
DirectInput是Microsoft DirectX API的一部分,主要用于游戏设备的输入管理,如键盘、鼠标和游戏杆等。在本项目“DirectInput游戏杆状态获取程序”中,开发者利用C++编程语言和DirectInput技术,创建了一个能够读取...
DirectInput和Xinput是两种微软开发的API,用于在Windows平台上与游戏手柄和其他输入设备交互,特别是针对游戏场景。这两个API各有特点,各有适用范围,对于开发者来说,理解它们的工作原理和区别至关重要。 Direct...
使用Direct Input 7 Joystick Class时,首先需要初始化DirectInput对象,然后创建Joystick实例,并设置其属性,例如设备的坐标系统、采样率等。接着,通过调用Acquire方法来建立与硬件的连接,并使用Poll或...
DirectInput和RawInput是Windows API中的两种输入处理技术,主要用于游戏和其他对用户输入有精确需求的应用程序。在本文中,我们将深入探讨这两种技术,并通过VC++(Visual C++)源码来理解它们的工作原理。 首先,...