代码之家  ›  专栏  ›  技术社区  ›  chillitom Cee McSharpface

赢得表格,记录所有点击?

  •  5
  • chillitom Cee McSharpface  · 技术社区  · 14 年前

    有没有办法将所有点击记录到一个Win表单应用程序中?我想截获点击并记录操作和导致它的控件的名称。

    这有可能吗?

    事先谢谢。

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

    5 回复  |  直到 7 年前
        1
  •  5
  •   Hans Passant    7 年前

    通过让应用程序的主窗体实现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;
        }
      }
    

    注意这个日志 全部的 点击应用程序的任何窗口。

        2
  •  1
  •   Community noseratio    7 年前

    你可以使用 Spy++ WinSpy++ 为了达到这个目的。

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

    但我不知道你如何能自己完成同样的事情。如果可能的话,您需要通过一个低级的WindowsAPI钩子或者一个消息处理程序来完成这项工作,这个消息处理程序允许您访问应用程序队列中的所有消息。

        3
  •  0
  •   Paulo Santos    14 年前

    好吧,你可以订阅 Click MouseDown 窗体上每个控件的事件。

        4
  •  0
  •   David Fox    14 年前

    使用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
    
    } 
    
        5
  •  0
  •   Paul Kohler    14 年前

    Nunitforms测试项目有一个记录器应用程序,可以监视这个事件和许多其他事件。代码非常聪明,值得一看。这是一个深思熟虑的项目。

    不过,这就是劳斯莱斯的解决方案!…

    尝试递归地将窗体的控件集合和子上下文遍历到基于类型的事件。

    PK:-)