c# - 如何通过按键盘上的单个键来防止调用多个 KeyDown 事件?
问题描述
我已将表单的 KeyPreview 属性设置为 true,以便在控制事件之前调用表单的键盘事件。表单和表单中的控件都有 KeyDown 事件,例如:
形式:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)) {
MessageBox.Show("Control + Enter (Form)");
}
}
控制:
private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (!e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)) {
MessageBox.Show("Control + Enter (TextBox)");
}
}
如您所见,这两部分代码的区别在于,在表单事件代码中我需要在用户同时按下 CTRL 和 Enter 键时调用 KeyDown 事件,在 TextBox 事件代码中,我需要调用该事件当用户按下 Enter 键而不按住 CTRL 键时。
问题是当我同时按下 Ctrl 和 Enter 键时,上述两个事件都会调用。如何防止调用这两个事件?
解决方案
我建议你使用这个textBox1_KeyUp
事件。你可以参考下面的代码。我的测试成功了。
public Form1()
{
InitializeComponent();
this.KeyPreview = true;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return))
{
MessageBox.Show("Control + Enter (Form)");
}
}
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Control)
{
e.Handled = true;
}
else if (e.KeyCode == Keys.Enter)
{
MessageBox.Show("Control + Enter (TextBox)");
}
}