﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Infinite Game Place-文章分类-DirectX9翻译-DirectInput</title><link>http://www.cppblog.com/outiejun/category/313.html</link><description>on the way to game programming</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 18:03:39 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 18:03:39 GMT</pubDate><ttl>60</ttl><item><title>（三）使用DirectInput</title><link>http://www.cppblog.com/outiejun/articles/1035.html</link><dc:creator>outiejun</dc:creator><author>outiejun</author><pubDate>Thu, 10 Nov 2005 02:03:00 GMT</pubDate><guid>http://www.cppblog.com/outiejun/articles/1035.html</guid><wfw:comment>http://www.cppblog.com/outiejun/comments/1035.html</wfw:comment><comments>http://www.cppblog.com/outiejun/articles/1035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/outiejun/comments/commentRss/1035.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/outiejun/services/trackbacks/1035.html</trackback:ping><description><![CDATA[<P align=left><FONT face=Arial size=2>这一节是一个实现Microsoft DirectX的向导，包含以下内容：</FONT></P>
<P><FONT face=Arial size=2><FONT color=#ff0000>创建DirectInput</FONT><BR><FONT color=#ff0000>DirectInput设备枚举</FONT><BR><BR>更详细的内容，参见“理解DirectInput”。<BR><BR>相关的信息，参见： <BR><FONT color=#ff0000>DirectInput设备</FONT><BR><FONT color=#ff0000>DirectInput设备数据</FONT><BR><FONT color=#ff0000>Action映射</FONT><BR><FONT color=#ff0000>力反馈</FONT> </FONT></P>
<P><FONT face=Arial size=2><FONT color=#ff0000 size=3><STRONG>创建DirectInput<BR></STRONG></FONT><BR>任何Microsoft DirectInput应用程序的第一步就是获取IDirectInput8接口。可以简单的调用DirectInput8Create函数来实现。 <BR>你可以创建单一一个DirectInput对象，直到应用程序终止再释放它。<BR></FONT><BR><FONT face=Arial color=#ff0000><STRONG>DirectInput设备枚举<BR></STRONG></FONT><BR><FONT face=Arial size=2>DirectInput可以查询系统所有的输入设备，决定他们是否已经连接，随后返回关于他们的信息。这个过程叫做枚举。<BR>如果你的应用程序仅使用了标准的键盘或鼠标，或者二者都有，那么你不需要作枚举。在Creating a DirectInput Device一节里会解释：在调用CreateDevice函数时你可以预定义全局变量来保存设备。 </FONT></P>
<P><FONT face=Arial size=2>下面的代码例子中，lpdi是一个指向IDirectInput8接口的指针，利用它创建一个键盘设备： <BR></FONT></P>
<P>&nbsp;</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">LPDIRECTINPUTDEVICE8&nbsp;lpdiKeyboard;&nbsp;<BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align=top>lpdi</SPAN><SPAN style="COLOR: #000000">-&gt;</SPAN><SPAN style="COLOR: #000000">CreateDevice(GUID_SysKeyboard,&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;</SPAN><SPAN style="COLOR: #000000">lpdiKeyboard,&nbsp;NULL);&nbsp;</SPAN></DIV>
<P>&nbsp;</P>
<P><FONT face=Arial size=2>IDirectInput8::CreateDevice的第一个参数是一个用于识别创建的设备类型的实例GUID（Instance GUID）。Microsoft DirectInput有两个预定义的GUID：GUID_SysMouse 和GUID_SysKeyboard，分别表示系统鼠标和键盘。你可以传给IDirectInput8::CreateDevice函数两个参数之一。但是全局变量GUID_Joystick不可以传入，因为它是一个产品GUID（Product GUID），不是实例化的GUID（Instance GUID）。</FONT></P>
<P><FONT face=Arial size=2><FONT color=#808080>备注：如果计算机安装有一个以上的鼠标，来自他们所有的输入将被组合构成系统设备。键盘也是如此。</FONT> <BR></FONT><BR><FONT face=Arial size=2>DirectInput提供了其余4个预定义的GUID用于测试。</FONT></P>
<P><FONT face=Arial size=2><FONT color=#006400>GUID_SysKeyboardEm</FONT> </FONT></P>
<P><FONT face=Arial size=2><FONT color=#006400>GUID_SysKeyboardEm2</FONT> </FONT></P>
<P><FONT face=Arial size=2><FONT color=#006400>GUID_SysMouseEm</FONT> </FONT></P>
<P><FONT face=Arial color=#006400 size=2>GUID_SysMouseEm2</FONT></P>
<P><BR><FONT face=Arial size=2>将他们传给IDirectInput8::CreateDevice函数后，函数将通过仿真层获得访问系统鼠标或者键盘的权限，level1或者是level2。这些GUID总是代表系统鼠标或者键盘。他们是GUID_SysKeyboard 和GUID_SysMouse的别名，因此他们不会被EnumDevices函数或者EnumDevicesBySemantics函数枚举，除非设置了DIEDFL_INCLUDEALIASES标志。</FONT></P>
<P><FONT face=Arial size=2>对于系统鼠标或者键盘以外的设备，使用的是被IDirectInput8::EnumDevices 或者IDirectInput8::EnumDevicesBySemantics实例化后返回的GUID。一个设备的实例GUID永远是同一个值。你可以允许用户从枚举的列表中选择一个设备，然后保存GUID到一个配置文件里，以便在以后的会话中重复利用。 <BR></P>
<P><FONT face=Arial size=2>2005年11月10日译, 不得用于商业用途。<BR><A href="mailto:outiejun@yeah.net"><FONT face=Arial color=#638f27>outiejun@yeah.net</FONT></A><BR><BR><FONT face=Arial size=2>Using&nbsp;DirectInput - Microsoft DirectX 9.0 SDK Update (October 2005)</FONT></FONT></P></FONT><img src ="http://www.cppblog.com/outiejun/aggbug/1035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/outiejun/" target="_blank">outiejun</a> 2005-11-10 10:03 <a href="http://www.cppblog.com/outiejun/articles/1035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（二）了解DirectInput</title><link>http://www.cppblog.com/outiejun/articles/1025.html</link><dc:creator>outiejun</dc:creator><author>outiejun</author><pubDate>Wed, 09 Nov 2005 11:28:00 GMT</pubDate><guid>http://www.cppblog.com/outiejun/articles/1025.html</guid><wfw:comment>http://www.cppblog.com/outiejun/comments/1025.html</wfw:comment><comments>http://www.cppblog.com/outiejun/articles/1025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/outiejun/comments/commentRss/1025.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/outiejun/services/trackbacks/1025.html</trackback:ping><description><![CDATA[<P><FONT face=Arial size=2>本节主要介绍Microsoft DirectInput的底层结构以及它与Microsoft Windows消息系统的关系。 </FONT></P>
<P><FONT face=Arial size=2><FONT color=#ff0000>DirectInput对象</FONT> </FONT></P>
<P><FONT face=Arial size=2><FONT color=#ff0000>与Windows交互</FONT> </FONT></P>
<P><FONT face=Arial size=2>关于DirectInput实现的实战信息，可参照“使用DirectInput”。 <BR></FONT><BR><FONT face=Arial size=2><FONT color=#ff0000 size=3><STRONG>DirectInput对象</STRONG></FONT> </FONT></P>
<P><FONT face=Arial size=2>一个专用于输入的DirectInput的实现由DirectInput对象（它支持IDirectInput8 COM接口）和一个DirectInputDevice对象（为每个输入设备提供数据）组成。每个DirectInputDevice对象依次包含设备对象（device objects），它们是单独的控制器或转换器，如按键、按钮或者轴。设备对象在这里也被称为设备对象实例（device object instances）。 <BR>每个DirectInputDevice对象代表一个输入设备，如鼠标、键盘或手柄。在DirectInput的API中，手柄（joystick）是指任意不同于鼠标或键盘的设备。一个硬件其实是不同类型的输入设备的组合，如带触摸板的键盘，可以表示成两个或两个以上的DirectInputDevice对象。强力回馈设备可以通过一个单独的包含输入输出的游戏杆表示。 </FONT></P>
<P><FONT face=Arial size=2>DirectInputDevice对象是实现IDirectInputDevice8接口的实例。应用程序可以通过IDirectInputDevice8::EnumObjects方法确定可用设备对象的数量和类型。个别的设备对象没有包装成代码对象，但在DIDEVICEOBJECTINSTANCE结构中有描述。 <BR>所有的DirectInput接口都包含在ANSI及Unicode的版本中，编译时，如果已经定义了UNICODE，就会使用UNICODE版本。 <BR></FONT><BR><FONT face=Arial size=2><FONT color=#ff0000 size=3><STRONG>与Windows交互</STRONG></FONT> </FONT></P>
<P><FONT face=Arial size=2>由于DirectInput直接与设备驱动进行交互，所以它既可以抑制也可以忽略Windows的鼠标及键盘消息。同样也可以忽略控制面板中键盘及鼠标的设置。尽管如此，它还是会使用游戏杆或其他游戏控制器的标准设置。 <BR>DirectInput不识别键盘的“字符重复”的设置。当使用缓冲数据的时候，DirectInput会把每一次的按下与释放看作一个单独的事件，而且不产生字符重复的序列。当使用立即数据的时候，DirectInput就只会关心当前按键的物理状态，而不是Windows所解释出的键盘事件。 </FONT></P>
<P><FONT face=Arial size=2>DirectInput不实现字符转换或变换。例如，SHIFT键与其他键将同等对待，而不是另外一个按键的修饰符。不管用户的系统语言设置是什么，按键总会返回相同的标识。 <BR>Windows 2000中，, 以独占模式获得键盘的话，将阻止其他后续的应用程序接收键盘数据。 </FONT></P>
<P><FONT face=Arial size=2>由于DirectInput直接访问鼠标驱动，因此它将绕过Windows鼠标数据解释子系统。依靠鼠标光标导航的应用程序应该继续使用标准的Windows鼠标消息及Microsoft Win32函数。 </FONT></P>
<P><FONT face=Arial size=2>当在独占模式下使用系统鼠标时，DirectInput会抑制鼠标消息，因此Windows将不能显示标准的鼠标图标。 </FONT></P>
<P><FONT face=Arial size=2>DirectInput会忽略控制面板中的设置，如加速、按钮交换。但DirectInput会自行识别驱动中的设置。例如，如果用户有一个三键鼠标，并使用驱动实用工具把中键设置为双击的快捷方式，DirectInput就会在中键单击时报告为两次主键的单击。</FONT></P>
<P><FONT face=Arial size=2>2005年11月9日译, 不得用于商业用途。<BR><A href="mailto:outiejun@yeah.net"><FONT face=Arial color=#638f27>outiejun@yeah.net</FONT></A><BR><BR><FONT face=Arial size=2>Understanding DirectInput - Microsoft DirectX 9.0 SDK Update (October 2005)</FONT></FONT></P><img src ="http://www.cppblog.com/outiejun/aggbug/1025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/outiejun/" target="_blank">outiejun</a> 2005-11-09 19:28 <a href="http://www.cppblog.com/outiejun/articles/1025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（一）介绍DirectInput</title><link>http://www.cppblog.com/outiejun/articles/1021.html</link><dc:creator>outiejun</dc:creator><author>outiejun</author><pubDate>Wed, 09 Nov 2005 09:47:00 GMT</pubDate><guid>http://www.cppblog.com/outiejun/articles/1021.html</guid><wfw:comment>http://www.cppblog.com/outiejun/comments/1021.html</wfw:comment><comments>http://www.cppblog.com/outiejun/articles/1021.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/outiejun/comments/commentRss/1021.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/outiejun/services/trackbacks/1021.html</trackback:ping><description><![CDATA[<P><FONT face=Arial size=2>DirectInput是一套输入设备的API，其中包括鼠标、键盘、手柄及其他游戏控制器，如力回馈（输入/输出）设备。</FONT></P>
<P><FONT face=Arial size=2>本节对DirectInput的功能作了简要说明，并简要介绍如何创建一个DirectInput应用程序。主要包含以下内容： </FONT></P>
<UL>
<LI><FONT size=2><FONT face=Arial><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff0000>DirectInput的能力</FONT> </FONT></FONT>
<LI><FONT size=2><FONT face=Arial><FONT color=#ff0000>从DirectInput开始</FONT> </FONT></FONT></LI></UL>
<P><FONT face=Arial size=2>要全面理解DirectInput是如何工作的，请参照“理解DirectInput”。 <BR>要逐步学习使用DirectInput API，请参照以下章节： </FONT></P>
<P><FONT face=Arial size=2>使用DirectInput </FONT></P>
<P><FONT face=Arial size=2>DirectInput 指南 </FONT></P>
<P><FONT face=Arial><FONT size=2><FONT color=#ff0000 size=3><STRONG>DirectInput的能力</STRONG></FONT> <BR></FONT><BR></FONT><FONT face=Arial><FONT size=2>除了为那些不被Win32 API所支持的设备提供服务外，DirectInput利用直接访问硬件驱动的方式来获取输入，这比windows消息的访问方式更快。 <BR></FONT><BR></FONT><FONT face=Arial size=2>即使应用程序处于后台，DirectInput也可以应用程序获取输入设备数据。同样，对任意类型的输入设备都提供完全支持，其中包括力回馈设备。 <BR>通过action映射，应用程序不需要知道具体使用的是什么类型的设备就可以获取输入数据。 <BR>DirectInput扩充的服务及改良的性能使它成为windows下的游戏、仿真以及实时交互极其有价值的工具。 <BR>然而对于使用键盘作文本输入或利用鼠标来导航的应用程序来说，DirectInput不会提供更多优势。更多信息，可参照 “与windows交互”。 </FONT></P>
<P><FONT face=Arial color=#ff0000><STRONG>从DirectInput开始</STRONG></FONT></P>
<P><FONT face=Arial size=2>这一节是一个关于如何建立和使用DirectInput样例应用程序的概览。</FONT></P>
<P><FONT face=Arial><FONT size=2>要获取细节和这些步骤的例子，参见“使用DirectInput”和“DirectInput指南”。 <BR></FONT><BR></FONT><FONT face=Arial size=2>备注：要了解DirectInput，需要理解以下术语：<BR>DirectInput对象：DirectInput接口的根对象<BR>设备：键盘、鼠标、手柄、或者其他输入设备。 <BR>DirectInputDevice对象：代码表现的键盘、鼠标、手柄、或者其他输入设备。<BR>Device对象：代码表现的键，按钮，触发器等等输入设备对象上的对象，也可以称作设备对象实例。</FONT></P>
<P><FONT face=Arial size=2>下面的步骤描述了一个简单的DirectInput实现，主要描述了应用程序如何接管创建设备并从每种设备（按钮，轴等等）生成各种数据等工作。</FONT></P>
<OL>
<LI><FONT face=Arial><FONT size=2>创建DirectInput对象。你可以使用这个对象来枚举设备并且创建DirectInput设备对象。</FONT> </FONT>
<LI><FONT face=Arial><FONT size=2>枚举设备。如果你只使用系统鼠标和键盘，那么这步不是很重要。要确定用户系统上的其他设备，就需要用DirectInput枚举出来。每次DirectInput找到了你需要的设备之后，你可以检查这个设备的能力，可以获取一个关于设备的唯一标识，利用这个标识创建一个DirectInput设备对象来表现这个设备。</FONT> </FONT>
<LI><FONT face=Arial><FONT size=2>为每个你想使用的设备创建DirectInputDevice对象。这一步需要使用上一步枚举出来的设备唯一标识。而对于系统的鼠标或者键盘，只需使用标准的GUID。</FONT> </FONT>
<LI><FONT face=Arial size=2>建立设备，对于每个设备，首先要设置一个协作的级别，它决定了与其他应用程序或系统共享这个设备的方式。同时也要设置数据格式来鉴别来自信息包的设备对象，例如按钮还是轴。如果你想获取缓冲数据（事件处理优先级高于实时状态的情况），那么也需要设置缓冲大小。至此你已经可以随意获取关于设备的信息了，可以进一步的控制应用程序的行为。你还可以设置一些属性例如手柄轴返回的值的范围。 </FONT>
<LI><FONT face=Arial><FONT size=2>获取设备。此时你通知DirectInput，你已经准备从设备获取数据了。</FONT> </FONT>
<LI><FONT face=Arial><FONT size=2>获取数据。在一个规律的时间间隔里，典型是在每次消息循环或者渲染循环时，既可以获取每个设备的即时状态也可以获取发生在上一次取回的事件记录。如果你愿意，还可以让DirectInput在事件发生时通知你。</FONT> </FONT>
<LI><FONT face=Arial size=2>对数据做出响应。应用程序可以对按钮和轴的状态或者事件（如一个键被按下或者松开）做出响应。 </FONT>
<LI><FONT face=Arial size=2>关闭DirectInput。在退出之前，应用程序应该归还所有的设备并且释放他们，然后释放DirectInput对象。</FONT></LI></OL>
<P><FONT face=Arial size=2>这并不是实现DirectInput的唯一途径。要想利用林林总总的已有的和未来的输入设备的优点，并且简单化用户的配置，你可以使用action映射（Action Mapping）。</FONT></P>
<P><FONT face=Arial size=2>要为一个设备设置action映射，你需要让DirectInput决定为每个应用程序行为使用何种设备对象。例如，一个赛车游戏中通常要指定一个速度控制器，通常用游戏控制器的y轴。利用action映射，你可以创建一个叫做AXIS_THROTTLE的action，然后让DirectInput指派这个action设备到适合的轴上去。当获取事件时，你利用关联的action来定位他们，这比利用设备对象直接生成他们更好。</FONT></P>
<P><FONT size=2><FONT face=Arial>更详细的信息，参见Action Mapping.<BR><BR>2005年11月9日译, 不得用于商业用途。<BR></FONT><A href="mailto:outiejun@yeah.net"><FONT face=Arial>outiejun@yeah.net</FONT></FONT></A><BR><BR><FONT face=Arial size=2>Introduction to DirectInput - Microsoft DirectX 9.0 SDK Update (October 2005)</FONT></P><img src ="http://www.cppblog.com/outiejun/aggbug/1021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/outiejun/" target="_blank">outiejun</a> 2005-11-09 17:47 <a href="http://www.cppblog.com/outiejun/articles/1021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>