检测按下ctrl+v键

本文关键字:ctrl+v 检测 | 更新日期: 2023-09-27 18:16:30

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

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

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

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

是否存在可以检测ctrl+vkeypress事件的方法?

我现在正在做什么

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

检测按下ctrl+v键

如果需要同时处理,可以使用类似的方法

看一下关键代码。你可以检测到无论按了什么键

.

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

 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中的复制粘贴值,因为用户可以粘贴任何东西!!

查看KeyDownKeyUp事件中Keys.Control的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 -控制。KeyDown事件MSDN -控制。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
    }
}

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

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

您应该使用KeyDown或KeyUp,因为KeyPress事件不是由CTRL按钮引发的,而是由"字符"按钮引发的。如果您使用KeyDown事件,您可以通过检查

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