监视Windows窗体应用程序

时间:2016-08-18 12:29:50

标签: c# .net windows winforms monitoring

我想监控winforms应用程序中的用户行为。

  

是否有一般方法可以挂钩到事件系统,而无需在每个表单或每个按钮上编写事件处理程序?

我想监控整个应用程序中的以下事件:

  • Windows已打开
  • Windows已关闭
  • 按钮点击
  • 理想情况:每种形式的时间花费

我不想订阅所有表单中的所有事件,应用程序对此很重要。我想挂钩并监控所有事件。

1 个答案:

答案 0 :(得分:2)

您不需要在每个表单和每个控件中编写事件句柄。您可以将逻辑放在基类Form类中。

您可以简单地为项目创建基本表单,并将日志逻辑放在那里。在基本表单中,您可以使用代码订阅所需的各种事件。

要应用解决方案:

  • 您无需更改设计器或设计器生成的代码。只需从BaseForm派生所有表单。
  • 可以使用find并替换所有命令来完成。

  • 另外,要创建下面的课程,请不要添加Form,只需添加课程并使用以下课程:

基本表格

public class BaseForm : Form
{
    public BaseForm()
    {
        if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) return;
        this.Load += BaseForm_Load;
        this.FormClosed += BaseForm_FormClosed;
    }
    private IEnumerable<Control> GetAllControls(Control control)
    {
        var controls = control.Controls.Cast<Control>();
        return controls.SelectMany(ctrl => GetAllControls(ctrl)).Concat(controls);
    }
    void BaseForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        Log(string.Format("{0} Closed", this.Name));
    }
    void BaseForm_Load(object sender, EventArgs e)
    {
        Log(string.Format("{0} Opened", this.Name));
        GetAllControls(this).OfType<Button>().ToList()
            .ForEach(x => x.Click += ButtonClick);
    }
    void ButtonClick(object sender, EventArgs e)
    {
        var button = sender as Button;
        if (button != null) Log(string.Format("{0} Clicked", button.Name));
    }
    public void Log(string text)
    {
        var file = System.IO.Path.Combine(Application.StartupPath, "log.txt");
        text = string.Format("{0} - {1}", DateTime.Now, text);
        System.IO.File.AppendAllLines(file, new string[] { text });
    }
}

注意

  • 您可以使用日志库或任何其他机制进行日志记录。
  • 您可以使用任何字符串格式进行日志。
  • 您只需添加属性/方法即可打开/关闭日志。
  • 您可能需要登录其他一些有用的活动,例如Application.ThreadException event。
  • 您只需使用StopWatch来计算用户使用表单的时间。您还可以简单地记录开始时间和结束时间以及用户使用表单的持续时间差异。
  • 以下是课程所需的用法:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Windows.Forms;