赢取表单,记录所有点击?

时间:2010-04-06 10:28:36

标签: winforms logging

有没有办法记录Win Forms应用程序中的所有点击?我想拦截点击并记录操作和导致它的控件的名称。

这可能吗?

提前致谢。

更新:我正在寻找一个应用程序范围的解决方案,是否没有办法将监听器添加到Windows事件队列(或者它被称为什么)?

5 个答案:

答案 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)

您可以使用Spy++WinSpy++来实现此目标。

alt text http://www.catch22.net/sites/default/files/images/winspy1.img_assist_custom.jpg

但我不确定你怎么能自己做同样的事情。如果可能,您需要通过低级Windows API挂钩或消息处理程序来执行此操作,该处理程序允许您访问应用程序队列中的所有消息。

答案 2 :(得分:0)

好吧,您可以订阅表单上每个控件的ClickMouseDown事件。

答案 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: - )