DirectX中的输入方式主要有两种,即键盘输入和鼠标输入,它位于Microsoft.DirectX.DirectInput名称空间中,所以首先要在项目中添加引用Microsoft.DirectX.DirectInput,然后在程序中引用该名称空间,如下:
using Microsoft.DirectX.DirectInput;
1、键盘输入
键盘作为一种输入设备,在DirectX中也有相应的类用于表示这类输入设备,那就是Microsoft.DirectX.DirectInput.Device(为了和前面定义的绘图设备区分,建议在定义和使用Device类前加上名称空间),所以在全局中定义如下变量:
private Microsoft.DirectX.DirectInput.Device keyboard;//定义键盘设备
接着就是创建初始化键盘设备的函数,如下代码:
public void InitializeKeyboard()
{
keyboard = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard);//实例化键盘对象
keyboard.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
keyboard.Acquire();//链接键盘设备
}
其中第一句代码表示把系统默认的键盘赋给键盘设备变量keyboard,第二句代码为keyboard设置一些参数,譬如说程序不是焦点时,键盘设备将不再和程序发生联系。Device.SetCooperativeLevel方法其定义如下:
public void SetCooperativeLevel(Control, CooperativeLevelFlags);
public void SetCooperativeLevel(IntPtr, CooperativeLevelFlags);
其中第一个参数Control,或IntPtr表示程序的上一级控件(Parent Control)或hwnd,第二个参数CooperativeLevelFlags为参数设置,其值如下表所示:
参数 | NoWindowsKey | Background | Foreground | NonExclusive | Exclusive |
值 | 16 | 8 | 4 | 2 | 1 |
在程序入口Main()函数中添加键盘设备初始化函数的调用,如下代码:
Input.InitializeKeyboard();//初始化键盘设备
定义键盘监听函数KeyboardListen()用于处理键盘输入对应的事件,如下代码:
private void KeyboardListen()
{
KeyboardState keys = keyboard.GetCurrentKeyboardState();
if (keys[Key.Escape])
{
DialogResult result=MessageBox.Show("是否退出程序?","提示",MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
Application.Exit();
}
}
}
最后在渲染函数Render()中添加调用键盘监听函数KeyboardListen(),如下代码:
KeyboardListen();
也可以在主函数Main()中调用该函数用于监听键盘输入,如下代码:
Input.KeyboardListen();
运行程序,其结果如下图所示:
2、鼠标输入
鼠标输入同样需要定义输入设备,如下代码:
private Microsoft.DirectX.DirectInput.Device mouseDevice;//定义鼠标设备
然后初始化鼠标设备,如下代码:
public void InitialMouse()
{
mouseDevice = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Mouse);//实例化鼠标对象
mouseDevice.Properties.AxisModeAbsolute = true;
mouseDevice.SetCooperativeLevel(this, CooperativeLevelFlags.NonExclusive | CooperativeLevelFlags.Background);
mouseDevice.Acquire();
}
其中第二句代码“mouseDevice.Properties.AxisModeAbsolute = true;”表示设置鼠标设备的坐标轴为绝对坐标。接着就添加鼠标监听函数MouseListen(),如下代码:
private void MouseListen()
{
MouseState mouseState = mouseDevice.CurrentMouseState;
byte[] buttons = mouseState.GetMouseButtons();
string info = "Mouse:";
info += "X:" + mouseState.X + " ";
info += "Y:" + mouseState.Y + " ";
info += "Z:" + mouseState.Z + " ";
for (int i = 0; i < buttons.Length; i++)
{
if (buttons[i] != 0)
{
switch (i)
{
case 0:
MessageBox.Show(info + "点击左键!");
break;
case 1:
MessageBox.Show(info + "点击右键!");
break;
case 2:
MessageBox.Show(info + "点击中键!");
break;
}
}
}
}
其中mouseState.GetMouseButtons()方法返回为一个长度为8的Byte数组,该数组中第一值表示鼠标左键,第二个值表示鼠标右键,第三个值表示鼠标中间滚轮。
然后在程序入口Main()函数中调用鼠标设备初始化函数,如下代码:
Input.InitialMouse();//初始化鼠标设备
最后在渲染函数Render()中添加鼠标事件监听函数,如下代码:
MouseListen();//添加鼠标设备监听函数
运行程序,其结果如下图所示:
除了通过前面定义设备的方式来获得鼠标和键盘的输入信息,还可以直接添加窗体的鼠标和键盘事件的重载函数来添加相应的响应事件,如为窗体添加鼠标按下的事件,如下代码:
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
MessageBox.Show("鼠标按下的位置在:X="+e.X.ToString() + ",Y=" + e.Y.ToString());
}
运行程序,其结果如下图所示: