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("=");
}
Author by
Andrei Cristian Prodan
Updated on August 05, 2022Comments
-
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 over 12 yearsmate i have seen your answers and i like the way you confidently add and it should work like you expected +1 :-)
-
Fischermaen over 12 years@PankajUpadhyay: Thank you! :-D
-
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 over 12 yearsOh 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 over 12 yearsOne more thing. The signs aren't working like Keys.Substract and so on. Any idea why?
-
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 over 12 yearseverything works well except enter, when i press enter, only the selected button is pressed
-
Andrei Cristian Prodan over 12 yearsOh 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.