如何阻止 NumericUpDown 在 EnterKeyPress 上播放“Ding”声音

本文关键字:Ding 声音 播放 何阻止 NumericUpDown EnterKeyPress | 更新日期: 2023-09-27 18:34:56

我的窗体上有几个NumericUpDown控件,每次我在它处于活动状态时按回车键时,它都会在我耳边播放这种可怕的 DING 噪音。如果我不处理 KeyPress 事件,它会播放,如果我处理KeyPress事件,它会播放,无论是否e.Handled = true

myNumericUpDown.KeyPress += myNumericUpDown_KeyPress;

private void myNumericUpDown_KeyPress(object sender, EventArgs e)
{
    if (e.KeyChar == 13)
    {
        e.Handled = true; //adding / removing this has no effect
        myButton.PerformClick();
    }
}

而且我不认为它正在发生,因为我正在处理它,就好像我没有注册事件(删除上面的第一行(,它仍然播放噪音。

如何阻止 NumericUpDown 在 EnterKeyPress 上播放“Ding”声音

使用 KeyDown(( 和 SuppressKeyPress,但单击 KeyUp(( 中的按钮:

    private void myNumericUpDown_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            e.Handled = e.SuppressKeyPress = true;
        }
    }
    private void myNumericUpDown_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            e.Handled = e.SuppressKeyPress = true;
            myButton.PerformClick();
        }
    }

*如果您将表单AcceptButton属性设置为"myButton",则根本不需要代码!

NumericUpDown 还会检查您按下的键是否是"数字键"(1-9,-,.(,这显然不是 Enter 键的情况。完成您想做的事情后,只需将e.KeyChar设置为任何数字键即可。设置e.Handled = true仍然是必要的,否则系统会将您的输入视为您实际按下该键并插入数字。

//Do something
e.Handled = true;
e.KeyChar = (char)Keys.D2;

对我来说,这非常有效。

好吧,您不应该像在 GUI 应用程序中那样使用 Enter 键。 它保留给另一个角色。 叮!是对此的不加掩饰的提醒。

您可以通过实际为 Enter 键提供预期用法来轻松取消它。 在窗体上放置一个按钮,将其 Visible 属性设置为 False。 选择窗体并将"接受按钮"属性设置为该按钮。 不再叮叮当当。

从 Enter 的奇怪用法中推断出,你可能希望使 Enter 键的行为与在控制台模式应用中的行为类似,将用户带到下一个控件。 通常改用 Tab 键完成。 您可以通过将此代码复制/粘贴到窗体类中来实现此目的并取消 UI:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Enter) {
            var ctl = this.ActiveControl;
            var box = ctl as TextBoxBase;
            // Make Enter behave like Tab, unless it is a multiline textbox
            if (ctl != null && (box == null || !box.Multiline)) {
                this.SelectNextControl(ctl, true, true, true, true);
                return true;
            }
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

我做这个技巧:

numericUpandDown KeyPress 函数中,如果e.KeyChar=13(Enter 键(,则必须设置e.Handled=true;(这将防止控件以任何方式更改其值(,紧随其后的set e.KeyChar=(char)46;(或任何其他数字接受值,它不会被写入e.Handled已经设置为 true(。

这样,e.KeyChar具有Visual Studio可接受的值,并且"Ding"不会发出声音。