使用ProcessCmdKey停止键在C#中触发事件?

时间:2013-08-21 20:13:11

标签: c# winforms keypress

所以我正在创建一个表单,我希望左右键只对应于我在表单上的numericUpDown框。所以我写的代码如下:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
         if (keyData == Keys.Right)
        {

            numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
        }
         if (keyData == Keys.Left)
        {
            try
            {
                numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);
            }
            catch { }
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

然而,如果它是当前所选视图的内容,它似乎仍然执行在表单上的不同对象之间移动的默认操作。如何停止默认操作?

4 个答案:

答案 0 :(得分:2)

当您不希望执行默认操作时,您需要返回true。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
     if (keyData == Keys.Right)
    {

        numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
        return true;
    }
     if (keyData == Keys.Left)
    {
        try
        {
            numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);
            return true;
        }
        catch { }
    }
}

答案 1 :(得分:1)

也许你应该返回true表示你已经处理了关键笔划消息,这样就没有其他控件可以获得它了。

答案 2 :(得分:0)

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
     if (keyData == Keys.Right){
        numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
        return true;
     }
     else if (keyData == Keys.Left){
        try {
            numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);              
        }
        catch { }
        return true;
    }        
    return base.ProcessCmdKey(ref msg, keyData);
}

注意:看起来你没有发布你运行的代码?我强烈建议您发布您的实际代码,但由于缺少return,您的代码甚至无法编译。而且您的代码缺少处理其他密钥所需的return base.ProcessCmdKey(ref msg, keyData);

答案 3 :(得分:0)

您可以添加事件处理程序并执行此操作:

private void keypressed(Object o, KeyPressEventArgs e)
{
    if (e.KeyCode == Keys.Right || e.KeyCode == Keys.Left)
    {

        e.Handled = true; //this line will do the trick
        //add the rest of your code here. 

    }
}