【问题标题】:How to catch multiple key in c#如何在c#中捕获多个键
【发布时间】:2017-07-13 20:36:42
【问题描述】:

如何捕捉用户分别在Windows窗体应用程序上分别按下左上右下方向箭头键时将完成的过程?

【问题讨论】:

  • 订阅KeyDown,获取相应的密钥? 到目前为止,您尝试为此编写什么代码?
  • 我只是尝试使用 if 循环(keys.up 和 keys.down 等)捕捉箭头键。我对 stackoverflow 以及互联网进行了研究。但是我没有找到这种东西。
  • 您将需要捕获 keydown 事件并跟踪到目前为止已按下的内容,然后在序列完成时执行更多代码。祝你好运,如果您遇到更具体的问题并可以分享代码示例,请随时发布更具体的问题。
  • 我试着喜欢这个; (pastebin.com/qkNuCURL) 在这段代码中运行顺利,Up+Right。但是当我将keys = 256 更改为512Up+Right+Left+Up 时,它不起作用。我可以做些什么来解决问题?

标签: c# .net visual-studio key arrow-keys


【解决方案1】:

一种方法是在KeyUpKeyDown 事件中跟踪它们。在下面的示例中,您可以从一个空白表单开始,然后双击该表单以创建Form_Load 事件。然后添加以下私有成员和Form_Load代码,这将设置表单的大小并在表单上放置标签:

// Fields to track keys that are pressed
private bool keyUpPressed = false;
private bool keyDownPressed = false;
private bool keyLeftPressed = false;
private bool keyRightPressed = false;

// A control to display the keypress status
private Label displayLabel = new Label();

private void Form1_Load(object sender, EventArgs e)
{
    // Set the form size and hook up the KeyDown and KeyUp events
    this.Size = new Size {Height = 700, Width = 700};
    this.KeyDown += Form1_KeyDown;
    this.KeyUp += Form1_KeyUp;

    // Put our display label on the form
    displayLabel.Location = new Point {X = 0, Y = 0};
    displayLabel.Size = new Size {Height = 100, Width = 300};
    this.Controls.Add(displayLabel);

    DisplayKeyStatus();
}

现在我们可以为 KeyDown 和 KeyUp 事件添加代码,我们只需检查哪个键被按下(或未按下),必要时更新我们的私有字段,然后显示键状态:

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Left:
            keyLeftPressed = false;
            break;
        case Keys.Up:
            keyUpPressed = false;
            break;
        case Keys.Right:
            keyRightPressed = false;
            break;
        case Keys.Down:
            keyDownPressed = false;
            break;
    }

    DisplayKeyStatus();
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Left:
            keyLeftPressed = true;
            break;
        case Keys.Up:
            keyUpPressed = true;
            break;
        case Keys.Right:
            keyRightPressed = true;
            break;
        case Keys.Down:
            keyDownPressed = true;
            break;
    }

    DisplayKeyStatus();
}

最后,使用我们正在跟踪的键的当前状态更新标签控件的方法:

private void DisplayKeyStatus()
{
    var message = new StringBuilder();
    message.AppendLine("Arrow keys pressed:");
    if (!(keyDownPressed || keyLeftPressed || keyRightPressed || keyUpPressed))
    {
        message.AppendLine(" - None");
    }
    else
    {
        if (keyLeftPressed) message.AppendLine(" - Left Arrow");
        if (keyUpPressed) message.AppendLine(" - Up Arrow");
        if (keyRightPressed) message.AppendLine(" - Right Arrow");
        if (keyDownPressed) message.AppendLine(" - Down Arrow");
    }

    displayLabel.Text = message.ToString();
}

【讨论】:

  • 首先非常感谢您的评论,这对我很有帮助。那么如何使用 if 循环来控制它呢?像这样; if (keyDownPressed && keyRightPressed && keyUpPressed) { MessageBox.Show("Test"); }具体应该用在哪里?
  • 我假设在 KeyDown 或 KeyPress 事件中,或者您需要知道的任何地方。这是为了游戏吗?
  • 不,它不是为了游戏。正是我的目的;如果按顺序按下这些键,我想编写要完成的过程。我正在尝试创建一个快捷键来锁定计算机。
  • 最新主题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2011-01-30
相关资源
最近更新 更多