C#:如何禁止在文本框keydown事件中无限期按下某个键?

时间:2009-04-01 23:44:00

标签: c#

C#:如何在文本框keydown事件中无限期地禁用某个键?

3 个答案:

答案 0 :(得分:3)

处理它的标准方法是为Textbox.KeyDown事件创建事件处理程序,然后如果按下的键与要禁用的键匹配,则将KeyEventArgs.SuppressKeyPress设置为true。这是一个例子:

yourTextBox.KeyDown += delegate(Object sender, KeyEventArgs e)
{
    e.SuppressKeyPress = (e.KeyCode == YOUR_KEY);
}

答案 1 :(得分:1)

使用e.SuppressKeyPress可以防止击键完全注册。

假设你想要第一次按键注册,但是当用户按下它时不能连续注册该按键作为击键,将e.SuppressKeyPress包装在一个类级别变量中,该变量在按下按键时进行注册。

public class nonRepeatingTextBox : TextBox
{
    private bool keyDown = false;

    protected override void OnKeyUp(KeyEventArgs e)
    {
        keyDown = false;
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (keyDown)
        {
            e.SuppressKeyPress = true;
        }
        keyDown = true;
    }
}

使用此类作为文本框。对于箭头键等,您可能希望在OnKeyDown覆盖中设置例外。

答案 2 :(得分:1)

我意识到我已经迟到了,但我需要vb中的这个功能,并且认为我会分享我的经验。

接受的答案似乎相当模糊,虽然它确实表达了答案的一部分,但我并不觉得它完全被冲了出来。 Stuart Helwig有一些有趣的代码,但不幸的是它有一些相当大的缺点:1)如果你输入的速度太快以至于在敲击下一个键之前你还没有释放前一个键,那么它被排除在外; 2)KeyDown适用于这个,alt和控制键以及没有CAPSLOCK的大写字母。因此,这是我试图清除答案的尝试。我希望有人发现它很有用,因为这是我的RegexTextBox非常需要的功能,它具有可以通过按住键来绕过的限制功能。

与Stuart Helwig一样,我继承了TextBox Control并添加了以下Subs。

我正在使用KeyDownKeyPressKeyUp个事件来解决问题。 KeyDown事件将KeyCode记录到KeyPressed字段以供稍后比较,KeyPress评估Keychar(但不是shift,alt,控制)并使用KeyPressEventArgs.Handled删除char条目,KeyUp重置keyPressedKeyIsDown字段。

Private Sub PreventHoldKeyUp(sender As Object, e As KeyEventArgs) _
        Handles Me.KeyUp
        Me.KeyIsDown = False
        Me.KeyPressed = Keys.None
End Sub

Private Sub PreventHoldKeyDown(sender As Object, e As KeyEventArgs) _
         Handles Me.KeyDown
        /* Recording the current key that was hit for later comparison */
        Me.KeyPressed = e.KeyCode
End Sub

Private Sub PreventKeyPressHold(sender As Object, e As KeyPressEventArgs) _
        Handles Me.KeyPress
        /* If a key has been struck and is still down */
        If Me.KeyIsDown Then

            /* The following allows backspace which is picked up by
             keypress but does not have a keychar */
            Select Case Convert.ToInt32(e.KeyChar)
                Case Keys.Back
                    Exit Sub
            End Select
            /* If this is the same key picked up by keydown abort */
            /* this portion allows fast typing without char drop
             but also aborts multiple characters with one key press */
            If Me.KeyPressed = Convert.ToInt32(e.KeyChar) Then
                e.Handled = True
            End If
        Else
            e.Handled = False
        End If

        Me.KeyIsDown = True

End Sub