监视Windows窗体应用程序

本文关键字:应用程序 窗体 Windows 监视 | 更新日期: 2023-09-27 18:03:01

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

是否有一种通用的方法来挂钩到事件系统,而不必在每个表单或每个按钮上编写事件处理程序?

我想在整个应用程序中监视以下事件:

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

我不想订阅所有表单中的所有事件,应用程序太大了。我只想钩住并监视所有事件

监视Windows窗体应用程序

您不需要为每个窗体和每个控件编写事件句柄。您可以将逻辑放在基本的Form类中。

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

应用解决方案:

  • 您不需要更改设计器或设计器生成的代码。只要从BaseForm推导出所有形式。
  • 这可以简单地使用查找和替换所有命令来完成。

  • 同样要创建下面的类,不要添加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事件。
  • 你可以简单地使用StopWatch来计算用户使用表单的时间。您还可以简单地记录开始时间和结束时间以及用户正在使用表单的持续时间的差异。
  • 这是你需要的类的用法:

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