在击键创建事件

时间:2011-04-09 18:08:31

标签: c# winforms events

我想在键盘上的每个键击发生时创建一个事件。到目前为止,我做到了这一点:

namespace WindowsFormsApplication1
{
  public partial class SpaceInvadors : Form
  {

    SpaceInvadors sInvaders;
    public SpaceInvadors()
    {
      InitializeComponent();
      KeyStroke keyStroke = new KeyStroke();
      sInvaders=new SpaceInvadors(keyStroke);
    }

    public SpaceInvadors(KeyStroke keyStroke)
    {
      keyStroke.keyStroked += Form1_KeyDown;//How does that chaining to the event work?
      keyStroke.keyStroked += Form1_KeyUp;
    }

    private void Form1_KeyDown(object sender, KeyArgs e)
    {
      if (e.KeyCode == Keys.Q)
      {
        Application.Exit();
      }
    }
  }
  public class KeyStroke
  {
    public event EventHandler<KeyArgs> keyStroked;
    public void Add(Keys key)
    {
        // I need to know how to obtain this key:
        KeyArgs keyAr = new KeyArgs(key);
        keyRisen(keyAr);
    }

    public void keyRisen(KeyArgs kA)
    {
        if (keyStroked != null)
            keyStroked(this, kA);
    }
}

public class KeyArgs : EventArgs
{
    public Keys KeyCode { get; set; }
    public KeyArgs(Keys key)
    {
        KeyCode = key;
    }
}

此外,我怎样才能一直听到按键的内容,而不仅仅是一次

2 个答案:

答案 0 :(得分:3)

对于你的问题

  

“另外,我怎么能一直听   什么键被按下,而不是   只有一次“

我看到你已经使用Form.KeyDown事件关闭你的游戏,如果按下'q':

    private void Form1_KeyDown(object sender, KeyArgs e)
        {
          if (e.KeyCode == Keys.Q)
          {
            Application.Exit();
          }
}

好的,您可以为方法添加更多键:

private void Form1_KeyDown(object sender, KeyArgs e)
    {
      if (e.KeyCode == Keys.Q)
      {
        Application.Exit();
      }
      else if (e.KeyCode == Keys.Up)
        spaceInvaders.MoveUp();
    }

对于链接,我认为KeyStoke类管理播放界面。因为KeyDown事件用于确定按下了哪个键。我建议你更多地了解活动和代表。

答案 1 :(得分:0)

如果我理解你正在写游戏,太空入侵者! :)
我不认为这种方法对游戏有好处。最合适和最常用的方法是使用GetKeyboardState函数。要使用此功能获得良好的游戏结果,您应该定期创建计时器并检查关键状态。我建议您在计时器例程中执行渲染。

如果某些原因阻止您使用GetKeyboardState,我会建议您使用PreviewKeyDown

相关问题