当按下回车键时中断按钮点击事件。

3

当用户按下回车键(而不是鼠标点击按钮)时,有一种简单的方法可以取消点击事件吗?

我已经尝试过以下方法:

    private void button3_Click(object sender, EventArgs e)
    {
        KeyEventArgs ke = e as KeyEventArgs;
        if (ke != null)
        {
            if (ke.KeyCode == Keys.Enter)
            {
                return;
            }

        }
    }

但是 ke 是 null


不确定为什么您想这样做。这是Windows程序工作的标准功能,您应该努力保持与规范一致(除非在某些不寻常的情况下)。如果您不希望它成为默认按钮,则可以从表单属性中删除它。 - awudoin
我在我的Winform中使用条形码扫描器。我已经设置了扫描仪在每次扫描后按回车键。但是,如果表单的按钮具有焦点并且用户扫描了一个条形码,按钮将执行单击事件(因为条形码扫描器会扫描代码并“按下”回车键)。 - iskrzycki
我认为更好的方法是在文本框中输入有效输入之前禁用按钮。这将防止意外使用扫描仪进行“点击”,并仍将保持用户对WinForms的期望标准。我知道许多用户喜欢使用键盘而不是鼠标(我也经常如此),禁用回车键会使他们感到烦恼。 - awudoin
在这个表单中,用户必须扫描几个条形码,并在组合框、列表框和其他窗口上设置一些内容,因此在此操作期间,所有控件都必须启用。 - iskrzycki
5个回答

3
public void btnClick(object sender, EventArgs e)
{
  bool IsMouse = (e is System.Windows.Forms.MouseEventArgs);

  // If not mouse, they hit spacebar or enter
}

顺便提一句,我记得最初是如何找到这个解决方案的。我在调试器中运行代码,并检查了使用鼠标和键盘触发按钮时的对象类型,发现它们是不同的对象类型。如果您使用Enter/Space,则会获得类型EventArgs,因此您无法针对MouseEventArgs进行测试,因为MouseEventArgs是从EventArgs继承而来的。 - Gary Walker

2

是的,它将为null。因为EventArgs不是KeyEventArgs

KeyDownKeyUp事件将KeyEventArgs作为参数传递。你搞砸了。


此外,button3_Click 是订阅 Button 类的 Click 事件的事件处理程序,这意味着被点击的是 Button 而不是被按下。 - Alan Turing

1
你可以像这样做:

你可以这样做

private bool flag = false;
private void button1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Return)
    {
        flag = true;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    if (flag)
    {
        flag = false;
        return;
    }
    //else do original task
}

有点凌乱,但可能会起作用 :) 谢谢,但是 @Gary Walker 发布了我认为更好的解决方案。 - iskrzycki

0
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if ((keyData & Keys.KeyCode) == Keys.Enter)
            {
                SendKeys.Send("{Tab}");
                return true;
            }
            return false;
        }

0

你可以为按钮处理KeyPress事件,并在那里禁用或忽略回车键,而不是在按钮单击中返回


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