取得鼠标输入
取得鼠标的输入和键盘很像。DirectInput在这两者之间很一致。使用相同的过程来创建设备;我们仅需要在枚举中指定鼠标而不是键盘。创建设备的代码如下:
MouseDev = new Device( SystemGuid.Mouse );
MouseDev.SetCooperativeLevel(m_form, CooperativeLevelFlags.Exclusive |
CooperativeLevelFlags.Foreground);
MouseDev.SetDataFormat(DeviceDataFormat.Mouse);
用鼠标的最大的区别是使用鼠标的数据。KeyboardState类表示键盘键的状态,我们使用MouseState类来表示鼠标的状态。此类包含了鼠标的状态以及鼠标X, Y和Z移动值的三个整数。我知道你也许会搔头问到,“Z!什么时候鼠标有三维的?”微软授予现代鼠标上的滚动轮为Z。鼠标的数据结构声明如下:
MouseState m_mousedata = new MouseState();
正如键盘,我们必须调用设备的方法Acquire来附加设备到硬件上,和Poll去从硬件上读取最新的数据。Polling我们可以从鼠标设备取得数据的拷贝:
m_mousedata = MouseDev.CurrentMouseState;
鼠标数据就如键盘数据使用。相应的位被置位如果某个按键被按下。Button 0是主键。虽然这是默认的左键,但是不要假定总是这样。通过Windows有可能指定右键是主按键(想想左撇子用户)。
鼠标数据结构里的轴数据表示至最后一次检查鼠标数据起的每个方向上移动的数量。遵从常用的微软坐标定义,X值右正左负。Y值前向正后向负。Z值向前旋转是正向后旋转是负。我们每帧只poll一次鼠标,搞清楚这个很重要。否则我们将会发现为什么鼠标的轴数据总是0。因为轴数据是相对上一次poll的。第二次poll将几乎总是0,除非鼠标在两次poll之间移动的飞快。
正如键盘,在我们用完鼠标后必须记得使用方法Unacquire来接触设备的附加。这会通知操作系统我们以及用完这个设备了。