假keyvalues通过keydown事件
问题描述:
我有一个MDI父窗体。当用户按下Enter时,我希望应用程序关闭。假keyvalues通过keydown事件
我检查keydown事件如下:
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyValue == (int)Keys.Enter)
{
Application.Exit();
}
}
现在它工作正常,当我没有对的形式(按钮,文本框等)的任何点击控制。 e.KeyValue
具有输入密钥(13)的(int)
值。但是,如果我将一些按钮或文本框放在MDI窗体上,则e.KeyValue
会带来Alt
键的密钥值,即18。
所以,现在如果我按Alt+Enter
,窗体关闭;但提前
答
不仅回车键
感谢你需要处理的按键响应有点早。下面的代码会为你工作:
protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m)
{
int _ENTER = 13;
int _KEYUP = 257;
if (m.Msg == _ENTER && (int)m.WParam == _KEYUP)
{
Application.Exit();
}
return base.ProcessKeyPreview(ref m);
}
答
使用e.KeyCode and e.Modifiers;
+0
我试着这样做:'如果(e.KeyCode == Keys.Enter && e.Modifiers == Keys.Alt)'' {'' Application.Exit ();' '}'但仍然无法正常工作 – Marshal 2011-04-23 03:33:44
是的,它工作完美。我只是通过交换_KEYUP和_ENTER来编辑你的答案。因为m.MSG会给_KEYUP而不是_ENTER。 – Marshal 2011-04-23 03:42:02
我仍然想知道,为什么呢? 我会在几分钟内接受它作为答案。我只是在等待有人回答我的'为什么这样'的部分! – Marshal 2011-04-23 03:42:29
该键由当前拥有焦点的控件处理。 因此,如果按下“Enter”键 - 重点控制将首先处理密钥。如果您使用附加键“Alt” - 它不强制集中控制来处理密钥。 你也可以尝试“Ctrl”+“Enter” - 它也应该由表单处理。有一个特殊的Form.KeyPreview属性,但它看起来在大多数情况下工作不正常。因此,在任何控制之前,您应该在窗体中重写ProcessKeyPreview或ProcessDialogKey方法以处理键。 – 2011-04-23 03:57:51