让复制粘贴快捷方式在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:我也有处理插入负数的代码,但在这个阶段不相关

让复制粘贴快捷方式在KeyPressEventHandler中传递

变化:

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;
        //[...]
相关文章:
  • 没有找到相关文章