我有一个用C#编写的简单控制台应用程序。我希望能够检测箭头键按下事件,以便用户可以进行控制。如何在控制台应用程序中检测keydown/keyup事件?
我通过搜索得到的所有信息都与Windows Forms有关。但是我没有图形用户界面(GUI)。这是一个控制机器人通过串口的控制台应用程序。
我已经编写了处理这些事件的函数,但不知道如何注册以实际接收这些事件:
private void myKeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Left:
...
case Keys.Right:
...
case Keys.Up:
...
}
}
private void myKeyUp(object sender, KeyEventArgs e)
{
... pretty much the same as myKeyDown
}
这可能是一个非常基础的问题,但我对C#相当新,并且以前从未需要获取这种类型的输入。
更新: 许多人建议我使用System.Console.ReadKey(true).Key
。这不会有所帮助。我需要知道按键按下的时刻,释放的时刻,支持同时按下多个键。而且,ReadKey是一个阻塞调用--这意味着程序将停止并等待按键被按下。
更新: 看起来唯一可行的方法是使用Windows窗体。这很烦人,因为我无法在无头系统上使用它。要求使用表单GUI接收键盘输入是...愚蠢的。
但是,为了记录下来,这是我的解决方案。我在我的.sln中创建了一个新的窗体项目:
private void Form1_Load(object sender, EventArgs e)
{
try
{
this.KeyDown += new KeyEventHandler(Form1_KeyDown);
this.KeyUp += new KeyEventHandler(Form1_KeyUp);
}
catch (Exception exc)
{
...
}
}
void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
// handle up/down/left/right
case Keys.Up:
case Keys.Left:
case Keys.Right:
case Keys.Down:
default: return; // ignore other keys
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
// undo what was done by KeyDown
}
请注意,如果您按住一个键,KeyDown将被多次调用,而KeyUp只会在释放键时调用一次。因此,您需要优雅地处理重复的KeyDown调用。