【问题标题】:New to C#-would like to add WndProcC# 新手-想添加 WndProc
【发布时间】:2011-08-29 07:00:50
【问题描述】:

大家,我对 C# 还很陌生,请帮助我...

我想添加 WndProc 来处理消息,我查看了属性,但我没有看到显示函数名称的迅雷,所以我可以添加一个我喜欢的。我在互联网上搜索并将 WndProc 视为

protected override void WndProc(ref Message msg) 
{
   //do something
}

我希望它为我生成,而不是输入它?

【问题讨论】:

    标签: c# winforms winapi wndproc


    【解决方案1】:

    WndProc 不是 .NET 事件处理程序;它是window procedure,是本机 Win32 API 的一部分。在 Visual Studio 中,您不会为它生成任何代码作为事件处理程序。

    在 Windows 窗体中,您所要做的就是覆盖窗体的现有 WndProc() 方法并开始编码。正如在 Form 类中找到的那样,如果您键入以下内容,则会有一个自动完成选项:

    override WndProc
    

    然后生成:

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
        }
    

    【讨论】:

    • 你的意思是我必须在部分类 Form1 的 public Form1(){....} 下面键入那个函数原型?
    • @Pevus:没错。但是您不必输入整个内容,因为覆盖基本方法的自动完成功能。我刚刚扩展了我的答案以表明这一点。
    • 如果您是新手,那么您不需要它的可能性非常高 - 如果您只想发送一些按钮单击、表单加载等,那么您肯定不需要它。 - 消息!
    • 是的,我完全忘了提到这一点。窗口消息是非常低级的,你应该远离,直到你对 Windows 编程更有经验。
    【解决方案2】:

    只是为了清楚地说明这一点:在 .net 世界中,您几乎不可能在 winforms/wpf/whatever 中使用 WndProc 做某事。 所有这些讨厌的东西都被抽象出来并隐藏在你面前,我不知道有一个我真正需要/错过它的案例。

    在 Winforms 中,您只需将事件与

    联系起来
    Eventname += EventHandlerMethod;
    

    (或者您可以使用匿名方法和 lambda 来做这些更高级的事情,但目前不要太在意它)。

    最简单的方法是使用设计器并将您的事件挂在那里: 使用此工具订阅事件后,编辑器将向您显示它创建的处理程序,您可以开始编写代码。

    这是一个简单的例子: 我刚刚开始了一个新项目,并在表单上添加了一个按钮“button1”:

    然后我连接按钮的 OnClick-Event(选择按钮并转到事件选项卡):

    最后我添加了代码以将按钮文本更改为“点击”到代码隐藏中:

    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace StackOverflowHelp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                // the following line is from InitializeComponent - here you can see how the eventhandler is hook
                // this.button1.Click += new System.EventHandler(this.OnButton1Clicked);
            }
    
            private void OnButton1Clicked(object sender, EventArgs e)
            {
                var button = sender as Button; // <- same as button1
                if (button == null) return; // <- should never happen, but who is to know?
                button.Text = "clicked";
            }
        }
    }
    

    就是这样。令人讨厌的事件分派由框架完成。

    【讨论】:

    • 怎么样?您在 Windows 中的每个事件是否都投射到某些 Winforms 事件中?很可能,但看到有另一个公认的答案,你可能可以使用它(这不像我一直在看我 4 年前的所有答案;))
    • 我在评论你关于不可能需要WndProc 的开场白;链接到该问题是为了表明有人需要它。
    • 哈哈,原来有一个抽象——"hidden" MouseWheel event。你赢了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 2019-11-09
    相关资源
    最近更新 更多