检测按下ctrl+v键
本文关键字:ctrl+v 检测 | 更新日期: 2023-09-27 18:16:30
我使用文本框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);
}
如果需要同时处理,可以使用类似的方法
看一下关键代码。你可以检测到无论按了什么键
.
创建一个包含您需要的所有输入的列表
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
中的复制粘贴值,因为用户可以粘贴任何东西!!
查看KeyDown
或KeyUp
事件中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)
{
...
}