按键检测ctrl + v

时间:2014-08-05 09:33:41

标签: c# .net keypress

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

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

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

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

是否有可以检测到ctrl+v keypress事件的 static IEnumerable<char> ValidFiancialCharacters { get { if(_validFiancialCharacters==null) { _validFiancialCharacters = new List<char>(); _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);
    }        

并在按键

{{1}}

5 个答案:

答案 0 :(得分:4)

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

看看Key Codes。您可以检测按键的按键

所以..

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

 public List<int> KeyCodes = new List<int>() { 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 event中的复制粘贴值,因为用户可以粘贴任何内容!!!

答案 1 :(得分:3)

只需查看KeyDown的{​​{1}}或KeyUp事件中的修饰符属性

  

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

样品

<强>的KeyDown

Keys.Control

KeyUp

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

更新

要仅允许某些输入,您可以使用 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

更多信息

答案 2 :(得分:2)

KeyPress事件无法捕获&#34; Ctrl + V&#34;由于某些原因。使用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
    }
}

答案 3 :(得分:1)

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

(Keys)e.KeyChar == Keys.V && Control.ModifierKeys == Keys.Control <br>

您必须使用:

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

因为键盘会生成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);
    }

答案 4 :(得分:0)

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

来检测ctrl+v
if (e.Control && e.KeyCode == Keys.V)
{
    ...
}