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

C# 如何获取用户在应用程序上花费的总时间,c#,winforms,timer,C#,Winforms,Timer,我很清楚vb.net有人问过这个问题,但是c#没有,我已经为这个代码苦苦挣扎了大约3周了,我在这一点上陷入了困境。 我需要获得用户在应用程序上花费的总持续时间。到目前为止,我已经尝试使用appstart和append时间跨度,但是我得到了00:00:00,我知道为什么会得到这个结果,但是我不知道如何解决我的问题,我束手无策。那么,有谁能向我解释一下,如何计算一个窗口打开的总时间,并实时保存这些信息呢 DateTime appStart = new DateTime(); Date

我很清楚vb.net有人问过这个问题,但是c#没有,我已经为这个代码苦苦挣扎了大约3周了,我在这一点上陷入了困境。 我需要获得用户在应用程序上花费的总持续时间。到目前为止,我已经尝试使用appstart和append时间跨度,但是我得到了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";
        }
这不是完整的应用程序,也不是它现在在另一台电脑上的样子,我还没有上传,但这或多或少地总结了应用程序的功能。我运行计时器的大部分代码,就像我说的,我卡住了

我试图做的事情的逻辑

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

等等。

为什么不直接记录日期时间。现在当用户启动应用程序或加载您感兴趣的表单时。然后,您可以随时检查当前的
DateTime.Now
和记录的日期time.Now之间的差异,看看它们被使用了多长时间?这似乎很明显?我错过什么了吗

所以

您感兴趣的应用程序启动或表单加载等…

Global.TimeStarted = DateTime.Now;

...
var usingAppFor = DateTime.Now - Global.TimeStarted;
任意时间或他们关闭应用程序等。

Global.TimeStarted = DateTime.Now;

...
var usingAppFor = DateTime.Now - Global.TimeStarted;
我使用了
Global
,但在您的体系结构中,将其存储在某个有意义的地方。不过,您已经了解了大概的想法。

作为基础,我将使用:

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对象,并运行相应的方法(如programActivated())。

这是Windows窗体应用程序吗?您能告诉use为什么会得到这样的结果吗?您能给我们展示一下实现吗?您所说的获取用户在应用程序上花费的总时间是什么意思?你是说用户启动应用程序已经多久了?或者什么?作为替代,如果需要,可以使用
全局.TimeStarted
进行更精确的测量。我想获取活动窗口的总运行时间,而不是我的程序。因此,您想获取窗口的总活动时间吗?那么,如果用户检查另一个窗口,计时器会停止吗?当窗口再次处于活动状态时是否继续?是,但不适用于所有窗口的窗体窗口然后将“totalTime”变量移动到您的程序类:public static TimeSpan totalTime,并使用它:Program.totalTime。然后将事件和“startTime”——我已经在答案中发布的变量添加到您希望遵循的所有窗口。确定。这是否适用于所有windows“包括”Microsoft word、Firefox以及基本上任何具有某种界面的应用程序?因为我真的认为你误解了这个问题