Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测密钥插入事件中的密钥_C#_.net_Winforms_Textbox_Keyevent - Fatal编程技术网

C# 检测密钥插入事件中的密钥

C# 检测密钥插入事件中的密钥,c#,.net,winforms,textbox,keyevent,C#,.net,Winforms,Textbox,Keyevent,我在表单上有一个文本框,试图检测用户键入的密钥。文本框是多行的,并启用了换行字。我不希望用户按enter键(因为我希望所有文本都在一行中输入,并包装),因此我使用了以下代码: private void txtPlain_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)13) { MessageBox.Show("Enter keys are not allowed");

我在表单上有一个文本框,试图检测用户键入的密钥。文本框是多行的,并启用了换行字。我不希望用户按enter键(因为我希望所有文本都在一行中输入,并包装),因此我使用了以下代码:

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事件的问题是,我不知道如何从文本中删除enter键,这与KeyPress事件不同,我可以将KeyChar设置为零。该事件捕获Enter键和Ctrl+Enter键,但光标仍会转到文本框中的下一行

谢谢你在这方面的帮助

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

编辑:

我认为你需要的是“向下键”而不是“向上键”

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;
        }

嗯,没有理由通过处理
KeyDown
keydup
事件来禁止输入键。您可以简单地将textbox控件的值设置为False。这将防止多行文本框对按Enter键作出响应

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

KeyDown
是一个很好的开始。您要做的是过滤掉所有包含
键的键盘事件。输入
标志。这将捕获它们,无论它们可能与其他哪个修改器键组合。然后,找到Enter键后,您需要将
e.Handled
属性设置为True,以防止将其传递给控件

但不幸的是,我们还没有完成。textbox控件尝试在内部处理某些键,而您将无法在键事件处理程序方法中重写这些键。您还需要告诉控件不要将该特定键解释为输入键。有两种主要的方法可以做到这一点。第一种(也是推荐的方法)是从基本
TextBox
类继承来创建自己的自定义控件,然后重写受保护的控件。第二种(稍微简单一点)方法就是处理,并将
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
调用。找到另一种方法来提醒用户他们的输入是不允许的,例如短嘟嘟声和文本框旁边的一个按钮。显示一个消息框是非常不和谐的,并且不是非常友好。有关其他提示和提示,请参阅。

第一条注释掉的行由于某些原因不起作用,因此如果有人可以解释为什么这会有用

您想检测Ctrl+Enter组合键。 如果(e.KeyData==(Keys.Control | Keys.Enter)){

Key.Control和Key.Enter只是一些值。现在执行逻辑or不一定会导致按键被按下。完全不合逻辑的子句

好的,现在来谈谈您想要检测的实际问题,输入笔划和Ctrl+Enter笔划将被视为相同。 此外,您希望撤消已引入的换行符。请重试

具有以下条件的PreviewKeyDown或PreviewKey up事件处理程序

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


让我知道这是否有效

如果这是WinForm,那么像这样执行按键检测就可以了……但是如果这是WebForm,那么将按键事件发送回服务器是个坏主意(因为这会造成聊天)。如果这是一个Web表单,请尝试使用类似于jQuery的东西来检测按键事件。@Capture:Hmm,
Keys
枚举是在
System.Windows.Forms
名称空间中定义的。这不太可能是一个Web表单应用程序。@Cody谢谢……我甚至没有想到要查找名称空间。我在这两个KeyU中都尝试了e.Handledp和KeyDown,但什么也没有发生。感谢MSDN链接-但看看它似乎同时使用了KeyDown事件和Keypress。这就是我在这种情况下可能需要做的。绝对没有理由你需要同时处理
KeyDown
Keypress
。MSDN示例很愚蠢。@harag希望它能为你工作你。我使用了e.Handle=true;事件没有进一步发送。@Gabriel-我尝试了在Up和Down事件中使用e.Handle,但这似乎不起作用。@Cody MSDN示例并不愚蠢。e.Handle必须在KeyPress中使用,而不是在KeyDown中使用。感谢上述……两件事1-我确实将“AcceptsReturn”设置为false(默认情况下),但返回键仍会将光标移动到下一行。-奇怪!-2-我在Keydown事件中输入了上面的代码,messagebox弹出,但enter键仍会添加到文本框中(即使使用ctrl键).3-是的,消息框仅用于测试,因此将被删除。谢谢我刚刚看到带有PreviewKeyDown事件的编辑文章,创建了一个新的windows应用程序,因此只需使用一个文本框的表单-将multiline设置为false(acceptreturns和wordwrap设置为defautlt)。添加了上面的代码-仍然没有-消息框显示,因此它捕获了Enter键。@harag:Erm,消息框应该显示是否按下了Enter键。我是否误解了您想要完成的任务?@Cody Gray-是的,它应该显示-但只有在我测试它时才显示。现在条件起作用了,消息框将被重新设置移动。-正如你所说,提醒用户的另一种方法是bette