-1

我想计算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();
}

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

4

3 回答 3

0

你必须使用一些这样Application-Wide Click message的:IMessageFilter

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;
    }
}
于 2013-10-23T11:18:17.823 回答
0

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

您基本上在将消息发送到控件之前收到消息,并且可以做任何您想做的事情(在您的情况下:增加一个计数器)。的返回值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 和一个充满各种控件的表单进行测试。

于 2013-10-23T11:18:34.730 回答
-1

用这个:

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

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Visible = false;
    }
  }
}
于 2017-03-22T18:27:03.007 回答