【问题标题】:How to fire form click event even when clicking on user controls in c#即使在c#中单击用户控件时如何触发表单单击事件
【发布时间】:2015-02-23 03:17:15
【问题描述】:

我需要检测来自其中包含许多用户控件的 Windows 窗体应用程序的所有鼠标单击。我可以捕获每个控件的单击事件并将其传递给主窗体,但这不切实际,因为窗体有许多自定义用户控件(超过一百个)并且其中一些已经在使用此事件。我尝试添加单击、鼠标单击、鼠标向上和向下事件,但如果您单击用户控件而不是表单的空白部分,我无法使它们触发。我在网上搜索了可能的解决方案,但没有什么令人满意的。

有没有一种实用的方法可以让表单点击事件触发,即使点击用户控件?我也欢迎任何在不使用表单点击事件的情况下记录用户鼠标点击的建议。

【问题讨论】:

  • 我在发帖前已经检查过该线程,但我在那里找不到实用的解决方案。不过,下面处理 Windows 消息的答案似乎很有希望。我测试后回复。

标签: c# forms click controls mouse


【解决方案1】:
    [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
        // 0x210 is WM_PARENTNOTIFY
        // 513 is WM_LBUTTONCLICK
        if (m.Msg == 0x210 && m.WParam.ToInt32() == 513)
        {
            // get the clicked position
            var x = (int)(m.LParam.ToInt32() & 0xFFFF);
            var y = (int)(m.LParam.ToInt32() >> 16);

            // get the clicked control
            var childControl = this.GetChildAtPoint(new Point(x, y));

            // call onClick (which fires Click event)
            OnClick(EventArgs.Empty);

            // do something else...
        }
        base.WndProc(ref m);
    }

【讨论】:

  • 感谢您的回答codemonkey,这是我在这个话题上看到的最实用的解决方案。我也在考虑直接处理 Windows 消息,但我不知道该怎么做。感谢您的帮助。
【解决方案2】:

这个问题现在已经很老了,但是有一些解决方案不涉及覆盖表单的 WndProc。

例如,您可以递归地向控件层次结构中的所有控件添加点击事件,如下所示:

private void SetupNestedClickEvents(Control control, EventHandler handler)
{
    control.Click += handler;
    foreach (Control ctl in control.Controls)
        SetupNestedClickEvents(ctl, handler);
}

您只需这样称呼它(ctl 是您想要应用它的 FormUserControlControl):

SetupNestedClickEvents(ctl, (sender, e) => { // Your code here });

例如:

SetupNestedClickEvents(this, (sender, e) => { Close(); });

在当前Form上运行,将设置层次结构中的任何控件在窗体下的任意位置单击时关闭窗体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多