检测KeyUp事件中的密钥

时间:2011-05-11 11:17:16

标签: c# .net winforms textbox keyevent

我在表单上有一个文本框,我正在尝试检测用户键入的键.TextBox是多线的,带有wordwrap。我不希望用户按下回车键(因为我希望所有文本都在一行输入,包装)所以我使用了以下代码:

private void txtPlain_KeyPress(object sender, KeyPressEventArgs e) {
    if (e.KeyChar == (char)13) {
        MessageBox.Show("Enter keys are not allowed");
        e.KeyChar = (char)0;
    }
}

这在我的测试中运行良好,但是当我测试CTRL + ENTER时它不起作用,因为我不知道如何检测控制键。从我的谷歌搜索我发现我需要使用KeyUp / Down事件,所以我现在有以下代码:

private void txtPlain_KeyUp(object sender, KeyEventArgs e) {
    //if (e.KeyData == (Keys.Control | Keys.Enter)) {

    if (e.KeyCode == Keys.Enter || (e.KeyCode == Keys.Enter && e.Control)) {            
        MessageBox.Show("Enter keys are not allowed:");
        //e.KeyValue = Keys.None;
    }
}

第一个注释掉的行由于某种原因无效,所以如果有人能解释为什么这会有用。

KeyUp / Down事件的问题在于我不知道如何从文本中删除回车键 - 与KeyPress事件不同,我可以将KeyChar设置为零。该事件捕获Enter和Ctrl + Enter键,但光标仍然转到TextBox中的下一行。

感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:5)

嗯,没有理由通过处理KeyDownKeyUp事件来禁止 Enter 键。您只需将文本框控件的AcceptsReturn property设置为False即可。这将阻止多行文本框响应按 Enter 键。

当然,这并不能解决 Ctrl + Enter 的问题。实际上,这是在AcceptsReturn属性设置为False时创建新行的预期方法。要解决这个问题,需要处理其中一个键盘事件,并阻止控件接收此输入。

KeyDown是个好地方。您要做的是过滤掉包含Keys.Enter标志的任何键盘事件。无论它们与哪个其他修饰键组合在一起,它都会捕获它们。然后,一旦找到Enter按键,就要将e.Handled属性设置为True,以防止它被传递给控件。

但不幸的是,我们还没有完成。文本框控件尝试在内部处理某些键,并且您无法在键事件处理程序方法中覆盖它。您还需要告诉控件不要将该特定键解释为输入键。有两种主要方法可以做到这一点。第一种(也是推荐的方法)是从基类TextBox类继承以创建自己的自定义控件,然后覆盖受保护的IsInputKey method。第二种(稍微简单)方法是处理PreviewKeyDown event,并将IsInputKey属性设置为False。

示例代码:

private void txtPlain_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    // Check if the KeyCode value has the Keys.Enter flag set
    if ((e.KeyCode & Keys.Enter) == Keys.Enter)
    {
        // Set the IsInputKey property to False
        e.IsInputKey = false;
    }
}

private void txtPlain_KeyDown(object sender, KeyEventArgs e)
{
    // Check if the KeyCode value has the Keys.Enter flag set
    if ((e.KeyCode & Keys.Enter) == Keys.Enter)
    {            
        // Show the user a message
        MessageBox.Show("Enter keys are not allowed in this textbox.");

        // Prevent the key event from being passed on to the control
        e.Handled = true;
    }
}

而且,虽然我认为这仅用于测试目的,但您肯定希望将MessageBox调用用于生产代码。找到另一种提醒用户不允许输入的方法,例如短蜂鸣声和文本框旁边的ErrorProvider component。显示消息框非常刺耳,并且不是非常用户友好。有关其他提示和提示,请参阅my answer here

答案 1 :(得分:1)

private void txtPlain_KeyUp(object sender, KeyEventArgs e) {
    //if (e.KeyData == (Keys.Control | Keys.Enter)) {

    if (e.KeyCode == Keys.Enter || (e.KeyCode == Keys.Enter && e.Control)) {            
        MessageBox.Show("Enter keys are not allowed:");
        //e.KeyValue = Keys.None;
        // mark event as handled
        e.Handled = true;
    }
} 

来自msdn link

修改

我认为您需要按键事件而不是按键

<强> EDIT2
这里有一些经过测试的代码,它可以按你的需要工作:

        bool invalid=false;
        private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if ((e.KeyCode & Keys.Enter) == Keys.Enter)
            {
                invalid = true;
            }
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (invalid)
            {
                e.Handled = true;
            }
            invalid = false;
        }

答案 2 :(得分:0)

由于某种原因,第一条注释掉的行没有起作用,所以如果有人能解释为什么这会有用。

您想要检测Ctrl + Enter。 if(e.KeyData ==(Keys.Control | Keys.Enter)){..

Keys.Control和Key.Enter只是一些值please refer。现在做逻辑或不一定会导致按下的键。完全不合逻辑的条款。

好了,现在来看你想要检测的实际问题输入笔划和Ctrl +输入笔划被视为相同。 此外,您想要撤消已引入的换行符。试试

具有以下条件的PreviewKeyDown或Preview key up eventhandler

如果(e.KeyCode == Keys.Enter)

让我知道这是否有效