C#:表单接收除回车键以外的所有按键
我正在设计一个定制计算器。在此计算器窗体上按下的任何键都应在“窗体”级别捕获。为此,我编写了以下代码-C#:表单接收除回车键以外的所有按键,c#,.net,forms,keypress,C#,.net,Forms,Keypress,我正在设计一个定制计算器。在此计算器窗体上按下的任何键都应在“窗体”级别捕获。为此,我编写了以下代码- private void BindControlMouseClicks(Control con) { con.MouseClick += delegate(object sender, MouseEventArgs e) { TriggerMouseClicked(sender, e); }; // bind to controls alread
private void BindControlMouseClicks(Control con)
{
con.MouseClick += delegate(object sender, MouseEventArgs e)
{
TriggerMouseClicked(sender, e);
};
// bind to controls already added
foreach (Control i in con.Controls)
{
BindControlMouseClicks(i);
}
// bind to controls added in the future
con.ControlAdded += delegate(object sender, ControlEventArgs e)
{
BindControlMouseClicks(e.Control);
};
}
private void TriggerMouseClicked(object sender, MouseEventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
this.KeyPreview = true;
this.KeyPress +=new KeyPressEventHandler(Form1_KeyPress);
BindControlMouseClicks(this);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
}
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
string key;
switch (e.KeyChar)
{
case '\r':
key = "ENTER";
break;
case ' ':
key = "SPACE";
break;
case (char)27:
key = "ESCAPE";
break;
default:
key = e.KeyChar.ToString();
break;
}
/* Some other code */
}
我在事件处理函数Form1\u Keypress
中设置了断点并添加了调试语句。令人惊讶的是,除ENTER键外,所有相关键(数字、字母、转义符、空格等)都会命中回调函数。NUMPAD ENTER键也会发生这种情况
你知道为什么只有ENTER键的处理方式不同吗
编辑
我的表单有一串按钮和一个文本框。当我把焦点放在文本框上时,瞧,回车键也会被调用!但如果我将焦点放在任何按钮上,则不会在按ENTER键时生成任何事件。由于我已将KeyPreview
设置为true,因此无论焦点在哪里,表单都必须获取此事件,对吗
编辑2
只有当表单上有按钮并且其中至少有一个有焦点时,才会发生这种情况。如果任何其他控件对其进行了聚焦,则其工作正常。我没有设置窗体的AcceptButton
属性。作为(),您可以尝试使用(char)键。返回而不是\r
:
switch (e.KeyChar)
{
case (char)Keys.Return:
key = "ENTER";
break;
也可能有?当窗体上的任何按钮都有焦点时,我描述的问题就会出现。所以我做了这两件事-
最初设置any_按钮。TabStop=false
。这样可以确保在启动表单时没有任何按钮获得焦点
当我们用鼠标点击一个按钮时,它会重新聚焦。我们最终会遇到同样的问题。为了解决这个问题,在鼠标点击处理程序中,我只需将焦点从按钮传递到其他控件。例如,我的表单有一个menustrip,我刚刚在鼠标单击处理程序中调用了menustrip1.Focus()
现在,回车键被捕获在表单\u Keypress
处理程序中
这是一个解决办法。但我还没有弄明白,当焦点在按钮上而不是其他控件上时,为什么enterkeypress不会被窗体捕获。我很高兴有更多关于这个问题的答案如果按回车键会发生什么?它抛出异常?它什么都没做?@ChrisCreateBoss什么都没发生。没有例外。你的表单中有文本框或按钮之类的组件吗?可能输入键被连接到一个文本框,所以它会聚焦它,或者如果是一个按钮,它会试图激活它。还可以尝试在按键事件处理程序中设置断点,调试,按enter键,看看是否发生了什么事情。您是否考虑过使用表单的AcceptButton
属性来绑定“计算”或“=”按钮,假设您有这样的东西?@Neilvereynne它不是重复的。我不希望按键转到文本框。我已经将KeyPreview=true设置为表单级别的所有按键。谢谢你的建议,但我的问题是,根本没有调用回调函数!!我复制粘贴您的代码,除了BindControlMouseClicks()调用,在按键事件处理程序的末尾,我有textBox.Text=key
。它适用于我-当我在表单上按ENTER键时,textBox接收ENTER文本。您可能会透露BindControlMouseClicks()函数是做什么工作的?我不希望按ENTER键转到textBox。我想在表单级别处理ENTER。您是否检查了ENTER键是否触发表单_Keypress()?我将为BindControlMouseCLicks()添加代码是我的问题是的,我检查了Form_按键是否被触发。我添加了BindControlMouseClicks,仍然有效。你能自己创建一个简单的项目来确信这些简单的事情是有效的吗?