C# 计算窗体及其元素上的每个鼠标单击数

C# 计算窗体及其元素上的每个鼠标单击数,c#,winforms,counter,C#,Winforms,Counter,我想数一数在窗口中制作的所有鼠标点击。我希望我点击的每个对象上的计数器都增加,即使它是一个按钮、表单本身或文本框等 到目前为止,我已经做到了这一点,但我似乎无法让它发挥作用: int mouseCounter = 0; private void Form1_Load(object sender, EventArgs e) { foreach (Control c in this.Controls) { c.Click += ClickCounter; }

我想数一数在窗口中制作的所有
鼠标点击。我希望我点击的每个对象上的计数器都增加,即使它是一个按钮、表单本身或
文本框

到目前为止,我已经做到了这一点,但我似乎无法让它发挥作用:

int mouseCounter = 0;
private void Form1_Load(object sender, EventArgs e)
{
    foreach (Control c in this.Controls)
    {
        c.Click += ClickCounter;
    }
}

void ClickCounter(object sender, EventArgs e)
{
    mouseCounter++;
    label8.Text = mouseCounter.ToString();
}

计数器现在只对单击控件作出响应,而不响应其自身的窗体。我怎样才能简单地解决这个问题?

您必须使用一些
应用程序范围的点击消息
IMessageFilter
,如下所示:

public分部类Form1:Form,IMessageFilter
{
国际鼠标计数器;
公共表格1()
{
初始化组件();
Application.AddMessageFilter(此);
}
公共布尔预过滤器消息(参考消息消息消息)
{
如果(msg.msg==0x202)//WM\u LBUTTONUP
{            
鼠标计数器++;
label8.Text=mouseCounter.ToString();
}
返回false;
}
}

您可以使用消息过滤器过滤(主)表单上的鼠标点击

您基本上是在消息被发送到控件之前得到它,并且可以做任何您想做的事情(在您的例子中:增加一个计数器)。
PreFilterMessage(ref Message m)
的返回值确定消息是否将被分派到控件:
false
表示您没有筛选消息,它将被分派

有关详细信息,请参阅

public partial class Form1 : Form, IMessageFilter
{
    public Form1()
    {
        InitializeComponent();
        label1.Text = "0";

        Application.AddMessageFilter(this);

    }

    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == 0x201) //wm_lbuttondown
        {
            label1.Text = "" + (Int32.Parse(label1.Text) + 1);
        }
        return false;
    }
}
使用.NET4.0和一个充满各种控件的窗体进行测试。

使用以下选项:

namespace TicTacToe
{
  public partial class Form1 : Form
  {
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Visible = false;
    }
  }
}

您可能需要使用递归函数来获取表单上的所有控件(
this.controls
限制性太强,只能检索“一级控件”):例如,请参阅我刚刚启动了一个新项目,其中我只输入了此代码、几个按钮、几个文本框和一个面板。现在计数器对每个元素的每次点击都有响应,但当我点击表单时,计数器不会增加。因此,现在它的行为与以前完全相反,但代码完全相同。好吧,在你的新项目中,如果你在面板上添加一个按钮(或任何其他控件),它肯定不会工作。。。我认为在你的“旧”项目中,你在“整个表单”上有一个面板,或者类似的东西(其他控件是这个面板/控件的子控件,所以这个面板是唯一一个响应点击事件的面板。在你的新项目中,如果你没有“主面板”,您还应该添加类似于
的内容。单击+=单击计数器
是的,您是对的,我第一次单击了GroupBox。计数器会响应我添加到表单中的所有按钮、所有文本框或其他控件。因此问题是,当我单击表单时,不会注册鼠标单击。@grimsan55应该添加一些代码声明
mouseCounter=0
,并且您还应该多谈谈它是如何工作的?是的,对不起,我以前注意到了mouseCounter,但是我让您的代码也工作了,所以谢谢:)我在您的答案中添加了一些大括号来完成代码。