让复制粘贴快捷方式在KeyPressEventHandler中传递
本文关键字:KeyPressEventHandler 快捷方式 复制 | 更新日期: 2023-09-27 18:13:49
在一个键按下的事件中,我使用这里的代码来禁用一些键(例如,我想允许只输入数字)。但是,这也禁用了快捷键,如CTRL-C等。我仍然可以用鼠标复制和粘贴,我仍然可以使用那些我不使用KeyPressEventHandler
的快捷键。
class IntegerTextBox : TextBox
{
public IntegerTextBox()
{
KeyPress += new KeyPressEventHandler(accept_only_digits); //disable "wrong" key presses, https://stackoverflow.com/a/4285768/2436175
}
void accept_only_digits(object sender, KeyPressEventArgs e)
{
char ch = e.KeyChar;
if (!char.IsNumber(ch) && ch != (char)Keys.Back && ch != (char)Keys.ControlKey) //The latter doesn't help
{
e.Handled = true;
return;
}
}
}
然而,与KeyEventArgs不同,keypressevenargs似乎没有必要的信息来知道是否按下了ctrl键。有办法绕过这个吗?例如,如果当前按下ctrl键,防止我的KeyPressEventHandler
被调用?
注意1:我知道这样用户将被允许粘贴垃圾
注2:我也有处理插入负数的代码,但在这个阶段不相关
变化:
ch != (char)Keys.ControlKey.
为:
!char.IsControl(ch)
这也使退格检查变得多余。
顺便说一下,我使用了一种不同的方法来处理我的"only int textbox",从这里引导覆盖粘贴的文本。
void TextBoxOnlyInt_KeyPress(object sender, KeyPressEventArgs e)
{
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar != '-'))
{
e.Handled = true;
}
if (e.KeyChar == '-')
if ((sender as TextBox).Text.Length != (sender as TextBox).SelectionLength)
if ((sender as TextBox).Text.Length > 0)
e.Handled = true;
}
protected override void WndProc(ref Message m)
{
int i;
if (m.Msg == 0x302)
if (int.TryParse(Clipboard.GetText(), out i))
{
//some restrict to avoid pasted make textbox value become invalid
if (i < 0 && this.SelectionStart != 0)
return;
else if (i < 0 && this.Text[0] == '-')
return;
else if (this.SelectionStart == 0 && this.Text[0] == '-')
return;
else
{
this.SelectedText = Clipboard.GetText();
return;
}
}
else return;
base.WndProc(ref m);
}
编辑:查看Nam Binh的解决方案,这更简单,更切中要点。
我通过添加KeyDown/KeyUp事件处理程序并保存控制键的当前状态来解决。
class IntegerTextBox : TextBox
{
private bool controlDown;
public IntegerTextBox()
{
controlDown = false;
KeyPress += new KeyPressEventHandler(accept_only_digits); //disable "wrong" key presses, https://stackoverflow.com/a/4285768/2436175
KeyDown += new KeyEventHandler(update_control_status);
KeyUp += new KeyEventHandler(update_control_status);
}
void update_control_status(object sender, KeyEventArgs e)
{
controlDown = e.Control;
}
void accept_only_digits(object sender, KeyPressEventArgs e)
{
if (controlDown)
{
return;
}
char ch = e.KeyChar;
//[...]