Winforms 赢取表格,记录所有点击?

Winforms 赢取表格,记录所有点击?,winforms,logging,Winforms,Logging,是否有办法记录Win Forms应用程序中的所有点击?我想截取点击并记录该操作以及导致该操作的控件的名称 这可能吗 提前谢谢 更新:我正在寻找一个应用程序范围的解决方案,是否没有办法将侦听器添加到windows事件队列(或它被称为什么)?好的,您可以订阅表单上每个控件的单击或鼠标向下事件。使用如下Mouseeventarg: private void Form_MouseDown(object sender, System.WinForms.MouseEventArgs e) {

是否有办法记录Win Forms应用程序中的所有点击?我想截取点击并记录该操作以及导致该操作的控件的名称

这可能吗

提前谢谢


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

好的,您可以订阅表单上每个控件的
单击
鼠标向下
事件。

使用如下Mouseeventarg:

    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

} 
您可以使用或来实现这一点


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

NunitForms测试项目有一个记录器应用程序,用于监视此事件和许多其他事件。代码非常聪明,值得一看。这是一个ThoughtWorks项目

这就是劳斯莱斯的解决方案

尝试根据类型将窗体和子控件的控件集合递归遍历到事件


PK:-)

您可以通过让应用程序的主窗体实现IMessageFilter接口来实现这一点。您可以筛选它获取的窗口消息并查找单击。例如:

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

请注意,这会记录应用程序任何窗口中的所有点击。

显然,但我正在寻找一种跨领域的关注点来解决这一问题。在大型应用程序中,这种方法是不可行的。创建一个派生自类的新类,然后将David Fox的代码放入新类中。在使用者窗体上,从新类继承,而不是从默认窗体继承。公共类表单1:MagicFormPerfect!非常感谢。我看过Application.AddMessageFilter,但不知道如何从句柄获取控件。