【发布时间】:2011-01-30 06:02:20
【问题描述】:
当我们按下一个键并持续按下它时,keypress 和 keydown 事件会不断触发。 有没有办法让这些只在一个完整的循环后触发,例如按键然后按键。
我希望用户不能连续按键,而是希望用户必须按下然后释放键盘才能输入字符!
这样就不会发生以下情况,例如:当用户按下 'p' 1 秒时,pppppppppppppppppppppppp。
【问题讨论】:
当我们按下一个键并持续按下它时,keypress 和 keydown 事件会不断触发。 有没有办法让这些只在一个完整的循环后触发,例如按键然后按键。
我希望用户不能连续按键,而是希望用户必须按下然后释放键盘才能输入字符!
这样就不会发生以下情况,例如:当用户按下 'p' 1 秒时,pppppppppppppppppppppppp。
【问题讨论】:
您可以通过使用 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 用于重复键。不知道为什么。
【讨论】:
if (m.Msg == 0x100 || m.Msg == 0x104 || m.Msg == 0x102) ... 和:\nelse if (m.Msg == 0x101 || m.Msg == 0x105 || m.Msg == 0x102)
为了防止按键在按住时多次触发:您必须像这样使用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 .... 了解相关信息
【讨论】:
声明一个布尔值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.
}
【讨论】: