【发布时间】:2015-03-16 23:44:17
【问题描述】:
我正在设计一个自定义计算器。在此计算器表单上按下的任何键都应在“表单”级别捕获。为此,我有以下代码-
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_Keypress 中设置了断点并添加了调试语句。令人惊讶的是,除了 ENTER 键之外,所有相关键(数字、字母、Escape、空格等)都击中了回调函数。 NUMPAD ENTER 键也会发生这种情况。
知道为什么只有 ENTER 键的处理方式不同吗?
编辑
我的表单有一堆按钮和一个文本框。当我将焦点放在文本框上时,瞧,ENTER 键也会调用回调!但是,如果我将焦点放在任何按钮上,则 ENTER 按键不会生成任何事件。由于我将KeyPreview 设置为true,因此无论焦点在哪里,表单都必须获取此事件,对吧?
编辑 2
只有当表单上有按钮并且至少有一个按钮关注它时才会发生这种情况。如果任何其他控件都关注它,它就可以正常工作。我还没有设置表单的AcceptButton 属性。
【问题讨论】:
-
按回车键会发生什么?它抛出异常?它什么都不做?
-
@ChrisCreateBoss 没有任何反应。没有例外或任何东西。
-
表单中有文本框或按钮等组件吗?也许输入键附加到文本框,因此它正在聚焦它,或者如果是按钮,它正在尝试激活它。还可以尝试在您的按键事件处理程序中放置断点,调试,按回车键,看看是否发生了什么。
-
您是否考虑过使用表单的
AcceptButton属性来绑定您的“计算”或“=”按钮,假设您有这样的东西? -
@NeillVerreynne 这不是重复的。我不希望按键进入文本框。我已设置 KeyPreview=true 以获取表单级别的所有按键