如何不允许在一键按下时收到多个键盘?

当我们按下一个按键并继续按下它时,按键和按键事件会持续发生。 有没有办法让它们只在一个完整的循环后才开火,例如keydown然后键入。

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

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

声明一个布尔值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. } 

您可以通过使用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。 不知道为什么。

要防止按键在按住时多次触发:必须使用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 ….以获取相关信息