检测按键上的ctrl+v

8
我正在使用文本框的keypress事件来处理仅选定输入。基本上,文本框允许用户输入可以计算的值。
例如,您可以键入(5*5)-(10/5)。
当前的方法类似于Convert.ToChar("*")==e.KeyChar等……
目前它不允许用户复制粘贴值。
有没有办法在keypress事件中检测ctrl+v?
更新:
目前我的做法是:
   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);
    }        

你为什么要在按键层面上工作呢?你不能只在文本框的变化时评估 textbox.Text,将按键和复制粘贴的责任留给标准文本框处理吗? - CodesInChaos
我正在限制用户输入某些值。只允许特定的值。 - user3090731
5个回答

8
如果您需要同时处理两个,可以使用类似的方法来完成。
请看一下“键码”的相关文章。您可以检测到按下了哪个键。
因此...
创建一个包含所有所需输入的列表。
 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;
}

由于用户可以粘贴任何内容,因此您可能需要在离开事件中验证复制粘贴的值!!!


KeyDownSuppressKeyPress存在一个问题,即如果您只想允许某些特定键,则会在窗体级别抑制所有其他键。例如:Alt+F4。 - 41686d6564 stands w. Palestine

6

只需查看您的 KeyDownKeyUp 事件中的 修饰符 属性,以了解按下了哪个组合键。

修饰符 获取 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");
      }
  }

或者按键松开事件
 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
}

更多信息


谢谢。但是我能否执行我在问题中提到的其他检查呢?它只允许特定字符。使用 keyup 事件? - user3090731
我目前同时拥有这两个事件。因此,即使从 KeyDown 传递事件,它也无法从 keypress 传递。 - user3090731
是的,我知道,但我遇到的问题是只允许某些其他字符与 ctrl+v 一起使用。即所有数字和一些其他输入,如 +,-,* 等等... - user3090731
让我们在聊天中继续这个讨论 - user3090731

3

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一起使用。即所有数字和一些其他输入,例如+,-,*。在keydown事件中是否可能? - user3090731
不可以。你需要继承你的文本框,重写 WndProc 并处理 Wm_Paste 消息。否则,你可以使用 TextChanged 事件来查看用户粘贴了什么。 - Sriram Sakthivel
不,我会单独处理粘贴的值。但是为了允许像我之前提到的类型值。 - user3090731
@Popeyethesailorman,这就是我所说的,你需要处理Wm_Paste并检查用户正在粘贴什么,然后决定是否允许。 - Sriram Sakthivel

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

0

你应该使用KeyDown或KeyUp,因为KeyPress事件不会被CTRL按钮触发,只会被“字符”按钮触发。如果您使用KeyDown事件,可以通过检查以下方式检测ctrl+v

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接