按键检测ctrl + v

我正在使用文本框keypress事件来处理只有选定的输入。 基本上, textbox允许用户输入可以计算的值。

即你可以输入(5*5)- (10/5)

当前方法检查如Convert.ToChar("*")==e.KeyChar等…

目前它不允许用户复制粘贴值。

无论如何可以检测到keypress事件的ctrl+v

更新

我现在在做什么

  static IEnumerable ValidFiancialCharacters { get { if(_validFiancialCharacters==null) { _validFiancialCharacters = new List(); _validFiancialCharacters.Add(Convert.ToChar("0")); _validFiancialCharacters.Add(Convert.ToChar("1")); _validFiancialCharacters.Add(Convert.ToChar("2")); // till 9 and _validFiancialCharacters.Add(Convert.ToChar("+")); _validFiancialCharacters.Add(Convert.ToChar("-")); _validFiancialCharacters.Add(Convert.ToChar("/")); //and some other } return _validFiancialCharacters; } } public static bool ValidateInput(KeyPressEventArgs e) { if (ValidFiancialCharacters.Any(chr => chr == e.KeyChar)) { e.Handled = false; } else { e.Handled = true; } return e.Handled; } 

并在按键

  private void txtRate_KeyPress(object sender, KeyPressEventArgs e) { NumberExtension.ValidateInput(e); } 

如果您需要同时处理两者,可以使用类似的方法完成

看看密钥代码 。 您可以检测按键的位置

所以..

创建一个包含所需输入的列表

  public List KeyCodes = new List() { 8, 17, 37, 39.....etc}; 

并使用KeyDown事件并使用KeyEventArgs.SuppressKeyPress属性

 private void Txt1_KeyDown(object sender, KeyEventArgs e) { if (KeyCodes.Contains(e.KeyValue) || (e.KeyCode==Keys.V && e.Control)) e.SuppressKeyPress = false; else e.SuppressKeyPress=true; } 

您可能需要在leave eventvalidation复制粘贴值,因为用户可以粘贴任何内容!

只需查看Keys.Control KeyDownKeyUp事件中的Modifiers属性

Modifiers获取KeyDown或KeyUp事件的修饰符标志。 标志指示按下了CTRL,SHIFT和ALT键的组合。

样品

的KeyDown

  this.myTextBox.KeyDown += new KeyEventHandler(myTextBox_KeyDown); private void myTextBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) { MessageBox.Show("Hello world"); } } 

KeyUp

  this.myTextBox.KeyUp += new KeyEventHandler(myTextBox_KeyUp); private void myTextBox_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) { MessageBox.Show("Hello world"); } } 

更新

要仅允许某些输入,您可以使用KeyPress事件。

 this.myTextBox.KeyPress += new KeyPressEventHandler(this.myTextBox_KeyPress); private void myTextBox_KeyPress(object sender, KeyPressEventArgs e) { int i; if (int.TryParse(e.KeyChar.ToString(), out i) || e.KeyChar == '(' || e.KeyChar == ')' || e.KeyChar == '.' || e.KeyChar == '*' || e.KeyChar == '+' || e.KeyChar == '-' || e.KeyChar == '/' // add some more) { } else e.Handled = true; // dont allow other inputs } 

更多信息

  • MSDN – KeyEventArgs类
  • MSDN – Control.KeyDown事件
  • MSDN – Control.KeyUp事件

由于某种原因, KeyPress事件没有捕获“Ctrl + V”。 使用KeyDown事件:

 private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.V) { //Ctrl + V } } 

要么

 private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == (Keys.Control | Keys.V)) { //Ctrl + V } } 

您应该使用KeyDown或KeyUp,因为KeyLress事件不是由CTRL按钮引发的,而是由“character”按钮引发的。 如果您使用KeyDown事件,您可以通过检查来检测ctrl+v

 if (e.Control && e.KeyCode == Keys.V) { ... } 

KeyPressEvent可以捕获Ctrl + V序列。
您无法通过以下方式检查它:

 (Keys)e.KeyChar == Keys.V && Control.ModifierKeys == Keys.Control 

你必须使用:

 (int)e.KeyChar==22 && Control.ModifierKeys == Keys.Control 

因为keybord生成ASCII = 22(同步空闲)。
下面的示例使TextBox能够接受带有逗号分隔符的+ – 金额,并允许按Ctrl + V进行粘贴

 protected override void OnKeyPress(KeyPressEventArgs e) { if (!( char.IsNumber(e.KeyChar) || ((Keys)e.KeyChar == Keys.Back) || (e.KeyChar == ',') || (e.KeyChar == '-') || ((int)e.KeyChar==22 && Control.ModifierKeys == Keys.Control) )) { e.Handled = true; } if (e.KeyChar == ',' && base.Text.IndexOf(',') > 0) { e.Handled = true; } base.OnKeyPress(e); }