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,但是我让您的代码也工作了,所以谢谢:)我在您的答案中添加了一些大括号来完成代码。