如何在一键按下时不允许多次击键?

时间:2010-03-22 08:25:56

标签: c# keyboard keypress

当我们按下一个按键并继续按下按键时,按键和按键事件会持续闪烁。 有没有办法让它们只在一个完整的循环之后才能激活,例如keydown然后键入。

我希望用户不能连续按键,而是希望用户必须按下然后释放键盘才能输入字符!

以便不会发生以下情况:例如:pppppppppppppppppppppppppp当用户按下“p”1秒时。

3 个答案:

答案 0 :(得分:7)

声明一个布尔isKeyDown,在KeyDown事件中,将布尔值设置为true。在KeyUp事件中,将布尔值设置为false。

这是示例代码

bool isKeyDown=false;
public void control_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if(isKeyDown)
      return;
    isKeyDown=true;
    // do what you want to do
}

public void control1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
   isKeyDown=false;
   // do you key up event, if any. 
}

答案 1 :(得分:5)

您可以通过使用IMessageFilter过滤关键消息来在应用程序范围内执行此操作。这是一个例子:

  public partial class Form1 : Form, IMessageFilter {
    public Form1() {
      InitializeComponent();
      Application.AddMessageFilter(this);
      this.FormClosed += (s, e) => Application.RemoveMessageFilter(this);
    }

    private Keys mLastKey = Keys.None;

    public bool PreFilterMessage(ref Message m) {
      if (m.Msg == 0x100 || m.Msg == 0x104) {
        // Detect WM_KEYDOWN, WM_SYSKEYDOWN
        Keys key = (Keys)m.WParam.ToInt32();
        if (key != Keys.Control && key != Keys.Shift && key != Keys.Alt) {
          if (key == mLastKey) return true;
          mLastKey = key;
        }
      }
      else if (m.Msg == 0x101 || m.Msg == 0x105) {
        // Detect WM_UP, WM_SYSKEYUP
        Keys key = (Keys)m.WParam.ToInt32();
        if (key == mLastKey) mLastKey = Keys.None;
      }
      return false;
    }
  }

我追求的一件事是WM_KEYDOWN消息中的重复计数。奇怪的是,这在我的机器上不起作用,重复键是1。不知道为什么。

答案 2 :(得分:3)

要防止按键在按住时多次触发:您必须使用SuppressKeyPress属性,如下所示:

bool isKeyRepeating = false;

public void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if (isKeyRepeating)
    {
        e.SuppressKeyPress = true;
    }
    else
    {
        isKeyRepeating = true;
    }

}

public void textBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
    isKeyRepeating = false;
}

请参阅:KeyEventArgs..::.Handled Property ...和... KeyEventArgs..::.SuppressKeyPress Property ....了解相关信息