user2678856
user2678856

Reputation: 15

Stop a key from firing an event in C# using ProcessCmdKey?

So I'm making a form, and I want the left and right keys to ONLY correspond to a numericUpDown box that I have on the form. So the code I wrote is the following :

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);
    }

However it seems to still do the default action of moving between different objects on the form if that's what the selected view is currently. How do I stop the default action?

Upvotes: 0

Views: 3027

Answers (4)

Luis Tellez
Luis Tellez

Reputation: 2973

you can add an event hanlder and do this:

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. 

    }
}

Upvotes: 0

Dutts
Dutts

Reputation: 6191

You need to return true when you don't want the default action to be carried out.

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 { }
    }
}

Upvotes: 2

nim
nim

Reputation: 382

Maybe you should return true to indicate you have processed the key stroke message so that no other controls get it.

Upvotes: 1

King King
King King

Reputation: 63327

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);
}

NOTE: It looks like that you didn't post the code you run? I highly recommend you to post the actual code of yours, your code doesn't even compile because lacking of return. And your code lacks the return base.ProcessCmdKey(ref msg, keyData); which is required to process other keys.

Upvotes: 0

Related Questions