C# 如何在C中生成按键窗体事件

C# 如何在C中生成按键窗体事件,c#,keyboard-events,C#,Keyboard Events,我试图在窗体上创建一个KeyPress事件,但在这一行中,我在MainWindow中遇到了一个错误。KeyPress=new KeyPress Events ArgsForm_KeyPress;,我读了微软关于C语言事件的文档,但我不明白 像Java中那样的侦听器是否存在于C中 我的代码: 课堂实践活动 { 静态环[]args { 表单主窗口=新表单; 文本=练习; MainWindow.MaximizeBox=false; MainWindow.ebox=假; MainWindow.FormB

我试图在窗体上创建一个KeyPress事件,但在这一行中,我在MainWindow中遇到了一个错误。KeyPress=new KeyPress Events ArgsForm_KeyPress;,我读了微软关于C语言事件的文档,但我不明白

像Java中那样的侦听器是否存在于C中

我的代码:

课堂实践活动 { 静态环[]args { 表单主窗口=新表单; 文本=练习; MainWindow.MaximizeBox=false; MainWindow.ebox=假; MainWindow.FormBorderStyle=FormBorderStyle.FixedSingle; MainWindow.StartPosition=FormStartPosition.CenterScreen; 主窗口尺寸=新尺寸1000700; MainWindow.KeyPreview=true; MainWindow.KeyPress=新按键事件参数窗体按键; MainWindow.ShowDialog; } 私有无效表单\按键对象发送者,System.Windows.Forms.KeyEventArgs e { ife.KeyCode==Keys.A{ MessageBox.show您按下了A键。; } } }
主方法是静态的,而事件处理程序不是。您需要为它提供一个对象引用,这就是错误消息试图说的。另一个错误是,您正在分配而不是附加处理程序,请为此使用+=运算符

具体来说,更改这一行:

MainWindow.KeyPress=新按键事件参数窗体按键

将来


您的代码中有几个错误

MainWindow.KeyPress=新按键事件参数窗体按键

1 KeyPress具有KeyPressEventHandler类型。不是按键事件参数。在名为…EventArgs的C类中,EventArgs通常用作包含有关引发事件的数据的特殊对象,它们从EventArgs系统类继承。称为…EventHandler的类通常为委托和事件定义包装器

2所以按键是事件。如果要订阅此事件,应使用+=运算符。要指定为处理程序的方法应具有签名voidobject,KeyPressEventArgs。事件的典型签名是voidobject,…EventArgs

私有无效表单\按键对象发送者,System.Windows.Forms.KeyEventArgs e

3正如我所说,此方法的签名KeyPressEventArgs而不是keypeventargs是错误的

它应该是静态的。不能在静态方法中使用非静态类成员

因此,您的代码应该如下所示:

    class PracticeEvent
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            Form MainWindow = new Form();
            MainWindow.Text = "Practice";
            MainWindow.MaximizeBox = false;
            MainWindow.MinimizeBox = false;
            MainWindow.FormBorderStyle = FormBorderStyle.FixedSingle;
            MainWindow.StartPosition = FormStartPosition.CenterScreen;
            MainWindow.Size = new Size(1000, 700);
            MainWindow.KeyPreview = true;
            MainWindow.KeyPress += Form_KeyPress;
            MainWindow.ShowDialog();
        }

        private static void Form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar == 'a')
            {
                MessageBox.Show("You pressed the A key.");
            }
        }
    }
在C中使用监听器不是一个好的实践,但是一些框架使用它。通常使用事件和回调


还有我最后的建议。您可能想使用KeyDown事件?按键用于处理字符输入。

如果出现错误,请将其粘贴到问题中。如果你想澄清一个想法,你需要解释什么部分没有意义。否则,你只会得到你读到的和不理解的东西的重写。两个bug,使用+=订阅一个事件。我的坏!缺少该位。它仍然是错误的,委托类型是KeyEventHandler。最好推荐语法sugar版本:MainWindow.KeyPress+=instance.Form_KeyPress;还有另一个。这就是我在答案中即兴编写代码时得到的结果。它很有效!,非常感谢。我将在microsoft文档中阅读有关EventArgs和EventHandler的更多信息。
    class PracticeEvent
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            Form MainWindow = new Form();
            MainWindow.Text = "Practice";
            MainWindow.MaximizeBox = false;
            MainWindow.MinimizeBox = false;
            MainWindow.FormBorderStyle = FormBorderStyle.FixedSingle;
            MainWindow.StartPosition = FormStartPosition.CenterScreen;
            MainWindow.Size = new Size(1000, 700);
            MainWindow.KeyPreview = true;
            MainWindow.KeyPress += Form_KeyPress;
            MainWindow.ShowDialog();
        }

        private static void Form_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar == 'a')
            {
                MessageBox.Show("You pressed the A key.");
            }
        }
    }