【问题标题】:Counting every mouseclick on a form and its elements计算表单及其元素上的每一次鼠标点击
【发布时间】:2013-10-23 10:30:00
【问题描述】:

我想统计一个窗口中的所有mouseclicks。我希望计数器在我单击的每个对象上增加,即使它是一个按钮、它自身的形式或 textbox 等等等。

到目前为止我有这个,但我似乎无法让它工作:

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

计数器现在只响应点击控件而不是它自己的表单。我怎样才能简单地解决这个问题?

【问题讨论】:

  • 您可能必须使用递归函数来获取表单上存在的所有控件(this.Controls 过于严格,只会检索“第一级控件”):例如,请参见 stackoverflow.com/questions/2525062/…
  • 我刚刚开始了一个新项目,我只输入了这段代码、几个按钮、几个文本框和一个面板。现在计数器响应每个元素的每次点击,但当我点击它自己的表单时不会增加。所以现在它的行为与以前完全相反,但代码完全相同。
  • 好吧,在你的新项目中,如果你在面板上添加一个按钮(或任何其他控件)肯定不会工作......我认为在你的“旧”项目中,你有“整个表单”上的面板,或类似的东西(其他控件是此面板/控件的子级,因此此面板是唯一响应单击事件的面板。在您的新项目中,如果您没有一个“主面板”,您还应该添加类似this.Click +=ClickCounter
  • 是的,你是对的,我第一次点击了分组框。计数器确实响应所有按钮或所有文本框或我添加到表单的所有其他控件。所以问题是当我点击它自己的表单时没有注册鼠标点击。

标签: c# winforms counter


【解决方案1】:

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

您基本上在将消息发送到控件之前就获得了消息,并且可以做任何您想做的事情(在您的情况下:增加一个计数器)。 PreFilterMessage(ref Message m) 的返回值决定了消息是否会被发送到控件:false 表示你没有过滤消息,它将被发送。

详情请见the documentation

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 和一个充满各种控件的表单进行测试。

【讨论】:

    【解决方案2】:

    你必须像这样使用Application-Wide Click messageIMessageFilter

    public partial class Form1 : Form, IMessageFilter 
    {
        int mouseCounter;
    
        public Form1()
        {
            InitializeComponent();
            Application.AddMessageFilter(this);
        }
    
        public bool PreFilterMessage(ref Message msg)
        {
            if(msg.Msg == 0x202) //WM_LBUTTONUP 
            {            
                mouseCounter++;
                label8.Text = mouseCounter.ToString();
            }
    
            return false;
        }
    }
    

    【讨论】:

    • @grimsan55 你应该添加一些声明mouseCounter = 0 的代码,并且你应该多谈谈它是如何工作的
    • 是的,抱歉,我之前注意到了 mouseCounter,但我让你的代码也能正常工作,所以谢谢 :)
    【解决方案3】:

    使用这个:

    namespace TicTacToe
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Visible = false;
        }
      }
    }
    

    【讨论】:

    • 我在您的答案中添加了一些大括号以完成代码。
    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多