c#中的keydown由于某种原因不起作用
Posted
技术标签:
【中文标题】c#中的keydown由于某种原因不起作用【英文标题】:keydown in c# doesn't work for some reason 【发布时间】:2012-01-28 11:13:51 【问题描述】:我正在尝试做一个计算器,我所要做的就是让它与键盘一起工作。这应该有效,但它没有。
private void Form1_KeyDown(object sender, KeyEventArgs e)
if (e.KeyCode == Keys.D1)
resultarea.Text = "fgdgd";
//number(1);
....
知道可能出了什么问题吗?
编辑:它仍然无法正常工作。我想我不妨把整个代码贴出来。
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)
【问题讨论】:
是 Winforms 还是 Wpf?您在表单上是否有其他控件,谁可能拥有焦点? @Fischer,我们可以通过 KeyEventArgs 看到,它是 Windows 窗体。 对不起,是的。当我按 1 时,resultarea 文本框里面没有文本 当我按下任何键时什么都没有发生,除了按下所选按钮的空格 lol 【参考方案1】:假设您有一个 WinForms 项目,请将表单的 KeyPreview
属性设置为 true,就像这样(例如在构造函数中):
public Form1()
InitializeComponent();
KeyPreview = true;
它应该像你预期的那样工作。
编辑:由于您的评论,我添加了代码以捕获所有标志(将其添加到您的 Form1_KeyDown 方法中)
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("=");
【讨论】:
朋友,我看到了你的答案,我喜欢你自信地添加的方式它应该像你预期的那样工作 +1 :-) @PankajUpadhyay:谢谢! :-D @AndreiCristianProdan:Form1_KeyDown
方法是否在某些情况下被触发?是不是还在连线。除非我可以在您的示例代码中看到该事件的订阅,否则我猜它是在设计器中连接的。也许这迷路了?
天哪,我简直不敢相信。我忘记了。去形成事件并添加我的keydown事件方法。现在工作。它仍然需要 KeyPreview = true,为什么?
还有一件事。这些标志不像 Keys.Substract 等那样工作。知道为什么吗?以上是关于c#中的keydown由于某种原因不起作用的主要内容,如果未能解决你的问题,请参考以下文章
C# Windows 窗体应用程序热键 - KeyDown 事件不起作用