C#:如何在文本框keydown事件中无限期地禁用某个键?
答案 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。
我正在使用KeyDown
,KeyPress
和KeyUp
个事件来解决问题。 KeyDown
事件将KeyCode
记录到KeyPressed
字段以供稍后比较,KeyPress
评估Keychar
(但不是shift,alt,控制)并使用KeyPressEventArgs.Handled
删除char条目,KeyUp
重置keyPressed
和KeyIsDown
字段。
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