如何获取用户在应用程序上花费的总时间

时间:2014-05-19 14:33:19

标签: c# winforms timer

我很清楚这个问题已经被要求用于vb.net但是没有c#,我现在已经在这个代码上苦苦挣扎了大约3个星期而且我坚持这一点。 我需要获得用户在应用程序上花费的总持续时间。到目前为止,我已经尝试使用appstart并追加时间跨度然而我得到00:00:00我知道为什么我得到这个结果但是我不知道如何解决我的问题而且我在我的智慧结束。所以任何人都可以向我解释如何计算窗口打开的总时间并实时保存这些信息。

DateTime appStart = new DateTime();
        DateTime appStart = new DateTime();
        TimeSpan Duration;
        DateTime now = DateTime.Now;
        string time = now.ToString();
        const int nChars = 256;
        int handle = 0;
        StringBuilder Buff = new StringBuilder(nChars);
        handle = GetForegroundWindow();

        if (GetWindowText(handle, Buff, nChars) > 0)
        {
            string strbuff = Buff.ToString();
            appstart = DateTime.Now();

            #region insert statement

            try
            {
                var with = cnSave;
                if (with.State == ConnectionState.Open)
                    with.Close();
                with.ConnectionString = cnString;
                with.Open();
                string strQRY = "Insert Into [Log] values ('" + strbuff + "', '" + time + "', '" + Processing + "')";


                OleDbCommand cmd = new OleDbCommand(strQRY, cnSave);
                try
                {
                    cmd.ExecuteNonQuery();
                }
                catch (Exception)
                {

                }

            }
            finally { }

            #endregion
            ActivityTimer.Start();
            Processing = "Working";
        }

这不是完整的应用程序,也不是它在不同PC上的那一刻,我还没有上传,但这或多或少总结了应用程序的功能我从定时器运行大部分代码而且就像我说我被困住了。

我想要做的逻辑。

  • 最终用户启动记事本。
  • 我的应用程序记录记事本处于焦点或时间的时间 活动窗口 -
  • 最终用户打开或切换到像Ms Words这样的新应用程序。
  • 我的应用程序记录用户切换或关闭记事本的时间,并计算这两次之间的差异,我得到总持续时间并将此信息保存到数据库中。

依此类推。

2 个答案:

答案 0 :(得分:2)

为什么不在用户启动应用程序或加载您感兴趣的表单时记录DateTime.Now。然后,您可以随时查看当前DateTime.Now之间的差异和记录的一个,看看他们已经使用了多久?这看起来很明显?我错过了什么吗?

因此...

您感兴趣的AppStart或表格等等......

Global.TimeStarted = DateTime.Now;

...

某些任意时间或关闭应用等...

var usingAppFor = DateTime.Now - Global.TimeStarted;

我使用过Global,但在您的架构存储中它有意义。你会得到一般的想法。

答案 1 :(得分:0)

作为基础,我会使用:

class SubscribedProgram
{
    public DateTime StartTime { get; set; }
    public TimeSpan TotalTime { get; set; }
    public object LinkedProgram { get; set; }

    public SubscribedProgram(object linkedProgram)
    {
        this.LinkedProgram = linkedProgram;
    }

    public void programActivated()
    {
        this.StartTime = DateTime.Now;
    }

    public void programDeactivated()
    {
        // If this was the first deactivation, set totalTime
        if (this.TotalTime == TimeSpan.MinValue) { this.TotalTime = DateTime.Now.Subtract(this.StartTime); }

        // If this is not the first calculation, add older totalTime too
        else { this.TotalTime = this.TotalTime + (DateTime.Now.Subtract(this.StartTime)); }
    }
}

然后以某种方式你需要监视每个跟随的程序“激活”和“停用”事件。每次触发其中一些事件时,您需要阅读程序,找到链接的SubscribedProgram-object,并运行它的相应方法(如programActivated())。