keydown in c# doesn't work for some reason

11,543

Assuming you have a WinForms project, set the KeyPreview property of your form to true, like that (e.g. in the constructor) :

public Form1()
{
    InitializeComponent();
    KeyPreview = true;
}

and it should work like you expected.

Edit: Due to your comment I've added the code to catch all the signs (add that to your Form1_KeyDown method)

if (((e.KeyCode == Keys.D7) && (e.Modifiers == Keys.Shift)) || (e.KeyCode == Keys.Divide))
{
    sign("/");
}
else if (((e.KeyCode == Keys.Oemplus) && (e.Modifiers == Keys.Shift)) || (e.KeyCode == Keys.Multiply))
{
    sign("*");
}
else if ((e.KeyCode == Keys.OemMinus) || (e.KeyCode == Keys.Subtract))
{
    sign("-");
} 
else if ((e.KeyCode == Keys.Oemplus) || (e.KeyCode == Keys.Add))
{
    sign("+");
} 
else if (e.KeyCode == Keys.Enter)
{
    sign("=");
}
Share:
11,543
Andrei Cristian Prodan
Author by

Andrei Cristian Prodan

Updated on August 05, 2022

Comments

  • Andrei Cristian Prodan
    Andrei Cristian Prodan almost 2 years

    I'm trying to do a calculator and all I have to do is make it work with the keyboard. This should work but it doesn't.

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D1)
            {
                resultarea.Text = "fgdgd";
                //number(1);
    
            }
        ....
        }
    

    Any idea what could have gone wrong?

    Edit: it's still not working. I figured I might aswell post the whole code.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            KeyPreview = true;
    
        }
        double first = 0;
        double second = 0;
        string op = "";
        bool last = true;
    
        public void calculate()
        {
            double aux = first;
            first = second;
    
            if (op == "+")
                second = aux + second;
            else if (op == "-")
                second = aux - second;
            else if (op == "*")
                second = aux * second;
            else if (op == "/")
                if (second == 0)
                    { first = aux; viewarea.Text = "Cannot divide by zero"; }
                else
                    second = aux / second;
            //if (viewarea.Text == "Cannot divide by zero")
                resultarea.Text = second.ToString();
    
        }
    
        public void number(int digit)
        {
            if (last == true)
            {
                resultarea.Clear();
                last = false;
                first = second;
                second = 0;
            }
            resultarea.Text += digit.ToString();
            second = second * 10 + digit;
    
        }
    
        public void sign(string sign)
        {
            if (last==false && (first != 0 && second != 0))
                calculate();
            op = sign;
            debug.Text = op;
            last = true;
        }
    
        private void equal_Click(object sender, EventArgs e)
        {
            if (last == false && (first != 0 && second !=0 ))
                calculate();
            op = "";
            last = true;
        }
    
        private void one_Click(object sender, EventArgs e)
        {
            number(1);
        }
    
        private void two_Click(object sender, EventArgs e)
        {
            number(2);
        }
    
        private void plus_Click(object sender, EventArgs e)
        {
            sign("+");
        }
    
        private void minus_Click(object sender, EventArgs e)
        {
            sign("-");
        }
    
    
    
        private void three_Click(object sender, EventArgs e)
        {
            number(3);
        }
    
        private void creset_Click(object sender, EventArgs e)
        {
            first = 0;
            second = 0;
            op = "";
            last = true;
            viewarea.Text = "";
            resultarea.Text = "";
            debug.Text = "";
        }
    
        private void four_Click(object sender, EventArgs e)
        {
            number(4);
        }
    
        private void five_Click(object sender, EventArgs e)
        {
            number(5);
        }
    
        private void six_Click(object sender, EventArgs e)
        {
            number(6);
        }
    
        private void seven_Click(object sender, EventArgs e)
        {
            number(7);
        }
    
        private void eight_Click(object sender, EventArgs e)
        {
            number(8);
        }
    
        private void nine_Click(object sender, EventArgs e)
        {
            number(9);
        }
    
        private void zero_Click(object sender, EventArgs e)
        {
            number(0);
        }
    
        private void divide_Click(object sender, EventArgs e)
        {
            sign("/");
        }
    
        private void times_Click(object sender, EventArgs e)
        {
            sign("*");
        }
    
        private void sqr_Click(object sender, EventArgs e)
        {
            second = Math.Sqrt(second);
            resultarea.Text = second.ToString();
        }
    
        private void cos_Click(object sender, EventArgs e)
        {
            second = Math.Cos(second);
            resultarea.Text = second.ToString();
        }
    
        private void sin_Click(object sender, EventArgs e)
        {
            second = Math.Sin(second);
            resultarea.Text = second.ToString();
        }
    
        private void tan_Click(object sender, EventArgs e)
        {
            second = Math.Tan(second);
            resultarea.Text = second.ToString();
        }
    
        private void nfac_Click(object sender, EventArgs e)
        {
            double aux = second;
            if (second == 0)
                aux = 1;
            else
            for (double i = 1; i < second; i++)
                aux= aux*i;
            second = aux;
            resultarea.Text = second.ToString();
        }
    
        private void log_Click(object sender, EventArgs e)
        {
            second = Math.Log(second);
            resultarea.Text = second.ToString();
        }
    
        private void ln_Click(object sender, EventArgs e)
        {
            second = Math.Log10(second);
            resultarea.Text = second.ToString();
        }
    
        private void xexp_Click(object sender, EventArgs e)
        {
            second = Math.Pow(second ,2);
            resultarea.Text = second.ToString();
        }
    
        private void dot_Click(object sender, EventArgs e)
        {
    
        }
    
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1)
            {
                viewarea.Text = "fgdgd";
                //number(1);
    
    
            }
            else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2)
            {
                number(2);
            }
            else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3)
            {
                number(3);
            }
            else if (e.KeyCode == Keys.D4 || e.KeyCode == Keys.NumPad4)
            {
                number(4);
            }
            else if (e.KeyCode == Keys.D5 || e.KeyCode == Keys.NumPad5)
            {
                number(5);
            }
            else if (e.KeyCode == Keys.D6 || e.KeyCode == Keys.NumPad6)
            {
                number(6);
            }
            else if (e.KeyCode == Keys.D7 || e.KeyCode == Keys.NumPad7)
            {
                number(7);
            }
            else if (e.KeyCode == Keys.D8 || e.KeyCode == Keys.NumPad8)
            {
                number(8);
            }
            else if (e.KeyCode == Keys.D9 || e.KeyCode == Keys.NumPad9)
            {
                number(9);
            }
            else if (e.KeyCode == Keys.Divide)
            {
                sign("/");
            }
            else if (e.KeyCode == Keys.Subtract)
            {
                sign("-");
            }
            else if (e.KeyCode == Keys.Add)
            {
                sign("+");
            }
            else if (e.KeyCode == Keys.Enter)
            {
                sign("=");
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
    
    }
    
  • Pankaj Upadhyay
    Pankaj Upadhyay over 12 years
    mate i have seen your answers and i like the way you confidently add and it should work like you expected +1 :-)
  • Fischermaen
    Fischermaen over 12 years
    @PankajUpadhyay: Thank you! :-D
  • Fischermaen
    Fischermaen over 12 years
    @AndreiCristianProdan: Is the Form1_KeyDown method triggered in some case? Is it still wired up. Unless I can see the subscription of that event in your sample code, I guess it is wired up in the designer. Maybe this got lost?
  • Andrei Cristian Prodan
    Andrei Cristian Prodan over 12 years
    Oh my god I can't believe this. I forgot about that. Went to form events and added my method for keydown event. Works now. It still needs the KeyPreview = true though, why?
  • Andrei Cristian Prodan
    Andrei Cristian Prodan over 12 years
    One more thing. The signs aren't working like Keys.Substract and so on. Any idea why?
  • Fischermaen
    Fischermaen over 12 years
    @AndreiCristianProdan: "One more thing..." is normally a new question. ;-) I've edited my answer according to your comment.
  • Andrei Cristian Prodan
    Andrei Cristian Prodan over 12 years
    everything works well except enter, when i press enter, only the selected button is pressed
  • Andrei Cristian Prodan
    Andrei Cristian Prodan over 12 years
    Oh yes, and divide doesn't work, funny you used keys.D7, isn't that used for 7? And about the enter, I think I have to make the buttons in my form unselectable or something.