假keyvalues通过keydown事件

假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); 
    } 
+0

是的,它工作完美。我只是通过交换_KEYUP和_ENTER来编辑你的答案。因为m.MSG会给_KEYUP而不是_ENTER。 – Marshal 2011-04-23 03:42:02

+0

我仍然想知道,为什么呢? 我会在几分钟内接受它作为答案。我只是在等待有人回答我的'为什么这样'的部分! – Marshal 2011-04-23 03:42:29

+2

该键由当前拥有焦点的控件处理。 因此,如果按下“Enter”键 - 重点控制将首先处理密钥。如果您使用附加键“Alt” - 它不强制集中控制来处理密钥。 你也可以尝试“Ctrl”+“Enter” - 它也应该由表单处理。有一个特殊的Form.KeyPreview属性,但它看起来在大多数情况下工作不正常。因此,在任何控制之前,您应该在窗体中重写ProcessKeyPreview或ProcessDialogKey方法以处理键。 – 2011-04-23 03:57:51

使用e.KeyCode and e.Modifiers;

+0

我试着这样做:'如果(e.KeyCode == Keys.Enter && e.Modifiers == Keys.Alt)'' {'' Application.Exit ();' '}'但仍然无法正常工作 – Marshal 2011-04-23 03:33:44