【问题标题】:False keyvalues are passed on keydown event错误的键值在 keydown 事件上传递
【发布时间】:2011-04-23 03:04:54
【问题描述】:

我有一个 MDI 父窗体。当用户按 Enter 时,我希望应用程序关闭。

我检查keydown事件如下:

 private void MainForm_KeyDown(object sender, KeyEventArgs e)
 {

     if (e.KeyValue == (int)Keys.Enter) 
     {
                    Application.Exit();
     }
 }

现在它工作正常,当我在表单(按钮、文本框等)上没有任何可点击控件时。 e.KeyValue(int) 值为 Enter 键 (13)。但是,如果我在 MDI 表单上放置一些按钮或文本框,e.KeyValue 会带来 Alt 的键值,即 18。为什么会这样??

所以现在如果我按Alt+Enter,表格就会关闭;但不仅在 Enter 键上

提前致谢

【问题讨论】:

    标签: c# winforms visual-studio key keypress


    【解决方案1】:

    您需要尽快处理 KeyPress。以下代码将为您工作:

        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);
        }
    

    【讨论】:

    • 是的,它运行良好。我刚刚通过交换 _KEYUP 和 _ENTER 编辑了您的答案。因为 m.MSG 会给出 _KEYUP 而不是 _ENTER。
    • 我还是想知道,为什么呢?我会在几分钟内接受它作为答案。我只是在等待是否有人回复我的“为什么”部分!
    • 键由当前具有焦点的控件处理。因此,如果您按“Enter” - 集中控制将首先处理该键。如果您使用附加键“Alt” - 它不会强制集中控制来处理该键。您也可以尝试“Ctrl”+“Enter” - 它也应该由表单处理。有一个特殊的 Form.KeyPreview 属性,但它看起来在大多数情况下都无法正常工作。因此,您应该在任何控件之前覆盖表单中的 ProcessKeyPreview 或 ProcessDialogKey 方法以处理键。
    【解决方案2】:

    使用e.KeyCode and e.Modifiers;

    【讨论】:

    • 我试过这样做:if (e.KeyCode == Keys.Enter && e.Modifiers == Keys.Alt) { Application.Exit(); } 但还是不行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2013-06-02
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多