有没有办法记录Win Forms应用程序中的所有点击?我想拦截点击并记录操作和导致它的控件的名称。
这可能吗?
提前致谢。
更新:我正在寻找一个应用程序范围的解决方案,是否没有办法将监听器添加到Windows事件队列(或者它被称为什么)?
答案 0 :(得分:5)
您可以通过让应用的主窗体实现IMessageFilter接口来实现此目的。您可以筛选它获取的Window消息并查找点击次数。例如:
public partial class Form1 : Form, IMessageFilter {
public Form1() {
InitializeComponent();
Application.AddMessageFilter(this);
this.FormClosed += (o, e) => Application.RemoveMessageFilter(this);
}
public bool PreFilterMessage(ref Message m) {
if (m.Msg == 0x201 || m.Msg == 0x203) { // Trap left click + double-click
string name = "Unknown";
Control ctl = Control.FromHandle(m.HWnd);
if (ctl != null) name = ctl.Name;
Point pos = new Point(m.LParam.ToInt32());
Console.WriteLine("Click {0} at {1}", name, pos);
}
return false;
}
}
请注意,这会在您应用的任何窗口中记录所有点击。
答案 1 :(得分:1)
alt text http://www.catch22.net/sites/default/files/images/winspy1.img_assist_custom.jpg
但我不确定你怎么能自己做同样的事情。如果可能,您需要通过低级Windows API挂钩或消息处理程序来执行此操作,该处理程序允许您访问应用程序队列中的所有消息。
答案 2 :(得分:0)
好吧,您可以订阅表单上每个控件的Click
或MouseDown
事件。
答案 3 :(得分:0)
像这样使用MouseEventArgs:
private void Form_MouseDown(object sender, System.WinForms.MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
MessageBox.Show(this,"Left Button Click");
break;
case MouseButtons.Right:
MessageBox.Show(this,"Right Button Click" );
break;
case MouseButtons.Middle:
break;
default:
break;
}
EventLog.WriteEntry("source", e.X.ToString() + " " + e.Y.ToString()); //or your own Log function
}
答案 4 :(得分:0)
NunitForms测试项目有一个记录器应用程序,可以监视此事件和许多其他事件。代码非常聪明,值得一看。这是一个ThoughtWorks项目。
虽然这是罗伊斯的解决方案!...
尝试根据类型递归地将窗体的Controls集合和subscibe移动到事件。
PK: - )