如何在Windows窗体应用程序中启用控制键功能?

问题描述 投票:0回答:1

我使用以下文本框keypress()事件来捕获用户输入的击键,以限制用户输入字母和数字值。

private void textBoxName_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = !(char.IsLetter(e.KeyChar) || 
                  e.KeyChar == (char)Keys.Space || 
                  e.KeyChar == (char)Keys.Back || 
                  e.KeyChar==(char)Keys.ControlKey );
} 

现在的问题是使用上面提到的代码,即使在keypress事件中处理keys.ControlKey,我也无法使用Ctrl + C或Ctrl + v等快捷键。 我在这里做错了什么?

提前致谢。

c# winforms textbox
1个回答
1
投票

如果在没有任何其他键的情况下按下Control键,则不会引发Keypress事件。仅用作键修饰符。在这种情况下,e.KeyChar返回char.IsLetter()认为false的修改值,!运算符在true中将其转换并将其分配给e.Handled,因此按键事件被取消。

捕获用户输入的击键以限制用户输入字母和数字值。

如果,如你所说,数字是所需输入的一部分,应使用char.IsLetterOrDigit()而不是char.IsLetter()

和标点符号?是输入的一部分吗? 这些符号被char.IsPunctuation()称为标点符号:\"%&/()?*@.,:;_-'

有两种方法可以得到相同的结果。 在两者中,char.IsControl(e.KeyChar)用于检查Control是否是Keycode的一部分,如果是,则通过XOR(ing)将其剥离。

1)使用简单的正则表达式进行过滤。这个可以让您更好地控制要过滤的内容。

Regex _KeyFilter = new Regex(@"^[a-zA-Z0-9.,]");

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
   if (e.KeyChar != (char)Keys.Back && e.KeyChar != (char)Keys.Return && e.KeyChar != (char)Keys.Space)
   {
        e.Handled = !_KeyFilter.IsMatch((char.IsControl(e.KeyChar)
                                      ? (char)(e.KeyChar ^ 64) 
                                      : e.KeyChar).ToString());
   }
}

2)使用char.IsLetterOrDigit()char.IsPunctuation()的Filtert

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
   if (e.KeyChar != (char)Keys.Back && e.KeyChar != (char)Keys.Return && e.KeyChar != (char)Keys.Space)
   {
       char _keypress = char.IsControl(e.KeyChar) ? (char)(e.KeyChar ^ 64) : e.KeyChar;
       e.Handled = !char.IsLetterOrDigit(_keypress) && !char.IsPunctuation(_keypress);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.