2

我有一个 winforms 应用程序,我想跟踪用户每次点击某些按钮等以及其他操作。什么是我跟踪这些信息的最佳方式,然后将它们放在一起,以便我可以针对最常用的功能等运行指标。

这是一个 winforms 应用程序,我在世界各地都有用户。

4

4 回答 4

2

您的设计必须确保解决两个大问题

  1. 隐私(Don 提到的)- 您必须清楚地知道您正在收集哪些信息并将其发送到中央服务器,理想情况下,用户应该能够检查您发送回中央服务器的确切数据(如果他们愿意的话) ) - 对于任何公共软件,都应该有一种非常简单的退出方式。

  2. 性能和可扩展性 - 您必须估计服务器端真正需要多少数据,并查看聚合和压缩数据客户端的各种技巧(以及对您将发送的流量和你多久发送一次)

至于客户端实现,我建议调查Sqlite.net或其他嵌入式数据库。使用嵌入式数据库在客户端存储此信息将为您提供很大的聚合灵活性,并将具有事务性、快速和易于实现的优势。Sqlite 有一个非常慷慨的公共领域许可证,因此从法律角度来看,它非常容易在公共应用程序中使用。

于 2008-11-17T06:01:44.087 回答
1

尝试做一个谷歌学者搜索。Ben Liblit 和合著者提出了一些有趣的想法,而 Alex Orso 和合着者的另一系列想法(免责声明 - 我是 Alex Orso 的合着者之一)基于从每个用户那里获取运行时信息样本,并以一种有趣的方式将它们组合在一起。

http://theory.stanford.edu/~aiken/publications/papers/pldi03b.pdf

http://www.cs.umd.edu/class/fall2006/cmsc838p/Ramss/remoteClassJournal.pdf

是此类论文/想法的两个(不一定是最好的)示例。

于 2008-11-17T05:29:15.600 回答
0

我会尝试这样的事情:

    // execute this method once all forms have been created
    public static void HookButtons()
    {
         foreach( Form f in Application.OpenForms )
         {
              EnumerateControls( f.Controls );
         }
    }

    public static void EnumerateControls( ICollection controls )
    {
        foreach( Control ctrl in controls )
        {
            if( ctrl.Controls.Count > 0 )
            {
                EnumerateControls( ctrl.Controls );
            }

            if( ctrl is ButtonBase )
            {
                ctrl.MouseClick +=new MouseEventHandler( ctrl_MouseClick );
            }
        }

    }

    static void ctrl_MouseClick( object sender, MouseEventArgs e )
    {
        ButtonBase clicked = ((ButtonBase)sender);

        // do something with the click information here
    }
于 2008-11-17T05:27:11.707 回答
0

小心你如何处理这件事。一些公司因收集太多信息或不清楚收集了什么而受到用户的强烈反对。最安全的方法是在启用任何“电话回家”功能之前询问用户。允许用户在发送之前查看实际数据似乎也不错。

我想知道是否有某种方法可以搭载一键式应用程序启动并检查更新时发生的一键式部署调用。不过我还没有调查。

至于收集实际数字,也许用户设置是最简单的地方。如果您不熟悉它们,只需查看项目属性并转到“设置”选项卡。

于 2008-11-17T05:48:03.473 回答