Подтвердить что ты не робот

Как рассчитать общее время, затрачиваемое пользователем на приложение?

Я хочу создать приложение, которое сможет рассчитать общее время, которое пользователь (т.е. сам) потратил на конкретное приложение, например Firefox. И это приложение должно отображать предупреждающее сообщение, если пользователь потратил много времени на Firefox (например, 1 час и более)

Причина. Я разработчик VB.NET. Во время моего рабочего времени основным инструментом является Visual Studio, и я предполагаю сделать кодирование. Но мне иногда нужно, чтобы Firefox обращался к интернету (особенно SO и другим сайтам), чтобы найти решения для моих проблем с программированием. Проблема заключается в том, что я зависим от SO и SO сосет свое время в течение часов, пока не забыл, что я предполагаю продолжить кодирование и не просматривать SO-сайт.

Мой вопрос. Как рассчитать общее время, затрачиваемое пользователем на открытое приложение, например Firefox?

Update:

Мне нужно воспроизвести песню как предупреждение для себя, если я слишком долго останусь на Firefox. Я намерен создать winform или службу Windows для достижения этого

4b9b3361

Ответ 1

Это не проблема программирования. Это проблема дисциплины. Мои советы:

  • Прежде всего, не полагайтесь на приложение, чтобы сказать вам, что делать.
  • Во-вторых, приложение может предупредить вас, но в конечном итоге вы можете отключить его, отключить.
  • В-третьих, мое предложение к вашей реальной проблеме, то есть отсутствие дисциплины и плохая трудовая этика, заключается в том, чтобы поставить небольшой баннер перед вашим монитором с этим текстом "Сосредоточьтесь на своей работе" или "Кодировать сейчас" или " SO is evil"

Ответ 2

Этот парень, Sateesh Arveti, закодировал то, что вы ищете: Активный наблюдатель приложений:

До сих пор я видел так много приложения, которые будут отображать систему использование с точки зрения памяти, процессор... Но, пользователь не хочет это все подробности. Он может ожидать знайте, сколько времени он тратит на каждое приложение, например браузер, Winamp к концу дня... Это приложение поможет пользователю узнать, сколько время, он тратит на каждый приложение каждый день. Эта приложение предполагает, что окно, который активен как приложение на который пользователь работает. Таким образом, это будет зарегистрируйте данные этого приложения, например название окна, название процесса и время потраченный на него в XML файле. Это будет продолжайте так, пока приложение закрыто. Однажды приложение закрыто, оно покажет всей активной информации о приложении в браузер с соответствующим форматом.

Вот моя простая версия vb.net(я добавил звуковое предупреждение для FireFox).

enter image description here

Создайте класс WinTracker:

Imports System
Imports System.ComponentModel

Public Class WinTracker
  Implements INotifyPropertyChanged
  Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
  Public Event SoundAlert(ByVal sender As Object, ByVal e As EventArgs)

  Private _ID As Integer
  Private _Text As String
  Private _ElapsedTime As TimeSpan
  Private _LastStart As DateTime
  Private _RunningTime As TimeSpan

  Public Sub New(ByVal id As Integer, ByVal text As String)
    _ID = id
    _Text = text
    Call StartTracking()
  End Sub

  ReadOnly Property ID() As Integer
    Get
      Return _ID
    End Get
  End Property

  Property Text() As String
    Get
      Return _Text
    End Get
    Set(ByVal value As String)
      If value <> _Text Then
        _Text = value
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Text"))
      End If
    End Set
  End Property

  Public Sub StartTracking()
    _RunningTime = TimeSpan.Zero
    _LastStart = DateTime.Now
  End Sub

  Public Sub StopTracking()
    _ElapsedTime += _RunningTime
    _RunningTime = TimeSpan.Zero
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("ToString"))
  End Sub

  Public Sub UpdateTime()
    _RunningTime = (DateTime.Now - _LastStart)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("ToString"))

    If _RunningTime.Seconds >= 60 Then
      RaiseEvent SoundAlert(Me, New EventArgs)
    End If
  End Sub

  Public Overrides Function ToString() As String
    Return "(" & FormatTimeSpan(_ElapsedTime + _RunningTime) & ")   " & _Text
  End Function

  Public Shared Operator =(ByVal thisItem As WinTracker, ByVal thatItem As WinTracker) As Boolean
    Return (thisItem.ID = thatItem.ID)
  End Operator

  Public Shared Operator <>(ByVal thisItem As WinTracker, ByVal thatItem As WinTracker) As Boolean
    Return Not (thisItem.ID = thatItem.ID)
  End Operator

  Private Function FormatTimeSpan(ByVal span As TimeSpan) As String
    Return span.Hours.ToString("00") & " hrs " & span.Minutes.ToString("00") & " min " & span.Seconds.ToString("00") & " sec"
  End Function

  Public Shared Sub SwitchWindows(ByVal FromWindow As WinTracker, ByVal ToWindow As WinTracker)
    FromWindow.StopTracking()
    ToWindow.StartTracking()
  End Sub

End Class

И затем создайте форму с таймером и списком:

Imports System
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Runtime.InteropServices

Public Class Form1
  Private Declare Auto Function GetForegroundWindow Lib "user32" () As IntPtr
  Private Declare Auto Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Int32, ByRef lpdwProcessId As Int32) As UInt32

  Private _Windows As New BindingList(Of WinTracker)
  Private _ActiveWindow As WinTracker

  Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    With ListBox1
      .ValueMember = "ID"
      .DisplayMember = "ToString"
      .DataSource = New BindingSource(_Windows, Nothing)
    End With
    Timer1.Enabled = True
  End Sub

  Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
    Dim hWnd As Integer = GetForegroundWindow().ToInt32

    If hWnd > 0 Then
      Dim id As Integer = 1
      Call GetWindowThreadProcessId(hWnd, id)
      If id > 0 Then
        Dim text As String = Process.GetProcessById(id).ProcessName

        If text <> String.Empty Then
          Dim spent As WinTracker = _Windows.FirstOrDefault(Function(x As WinTracker) x.ID = id)
          If spent Is Nothing Then
            spent = New WinTracker(id, text)
            _Windows.Add(spent)

            If text.ToLower = "firefox" Then
              AddHandler spent.SoundAlert, AddressOf WinTracker_SoundAlert
            End If

          Else
            spent.Text = text
          End If

          If _ActiveWindow Is Nothing Then
            _ActiveWindow = spent
          Else
            If _ActiveWindow <> spent Then
              WinTracker.SwitchWindows(_ActiveWindow, spent)
              _ActiveWindow = spent
            Else
              _ActiveWindow.UpdateTime()
            End If
          End If

        End If
      End If
    End If
  End Sub

  Private Sub WinTracker_SoundAlert(ByVal sender As Object, ByVal e As EventArgs)
    My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Beep)
  End Sub    

End Class

Рефакторинг по мере необходимости.

Ответ 3

Я настоятельно рекомендую подписаться на RescueTime

Простые причины:

  • Он хочет, чтобы вы спросили. (Отслеживание использования приложения, использование браузера, дифференциация между продуктивным и непроизводительным просмотром веб-страниц, предупреждает вас, если вы тратите слишком много времени на провал и т.д.).
  • Это невероятно быстро настроить (чтобы вы не тратили еще больше времени).
  • Это бесплатно (для всех вещей, в которых вы нуждаетесь).

Я написал сообщение о том, насколько полезным был этот инструмент. Я опишу его здесь.


Это программа, которую вы устанавливаете на свой компьютер, которая отслеживает, какая программа имеет фокус в течение дня, а затем некоторые. Измеряется время использования каждого приложения, а при использовании браузера измеряется время, которое вы тратите на отдельные веб-сайты. С панелью управления, которая позволяет классифицировать каждую программу и определенные веб-сайты (и группировать вместе другие) и позволяет определить, связана ли эта программа или веб-сайт с производительной работой или отвлекает работу (или нейтраль). По умолчанию он знает, что различные веб-сайты и программы, такие как Facebook и MSN, отвлекают, а другие, такие как сайты Microsoft Word и Research, являются продуктивными - но вы можете настроить все это:

site classification

Как вы можете видеть выше, Ive получил сайты социальных сетей, мессенджеров и персональные сайты электронной почты, которые были отброшены или отвлекают от моей работы, а программы и сайты, которые я использую для работы, перечислены как продуктивные. Есть несколько веб-сайтов, отделенных от просмотра, но все остальные посещаемые сайты сгруппированы под "Firefox", что в основном является тем временем, когда я проводил онлайн-исследования для разных языков программирования и парадигм.

Программа берет всю эту информацию за ваше время, проведенное с вашего компьютера, а затем дает вам обзор того, как вы проводите время в течение дня:

dashboard

Это показывает, что я провожу до 15 минут каждые пару часов, делая что-то другое, кроме работы. Когда я работаю, вы можете видеть, что я провел 3 часа, проводя исследования в Интернете, около 2,5 занимался разработкой программного обеспечения, 45 минут с электронной почтой и т.д.

Когда сделал перерыв и решил быть непродуктивным, я провел больше всего времени на FFYa (25 минут).

Этот инструмент будет полезен для размышлений о том, сколько работы вы делали в определенный час, день, неделю или месяц. Различные временные шкалы позволяют сравнивать и визуализировать время, когда вы находитесь в хрусте, против того времени, когда вы получаете привычку расслабляться. Что еще лучше, это позволяет вам устанавливать цели для себя.

Goals

Решите сами, сколько времени вы готовы потратить на провал, и сколько работы вы хотите сделать, и даже запрограммируйте всплывающее уведомление, которое сообщит вам, если вы заблудитесь любым количеством предопределенных способов.

Alerts

Одна из моих любимых частей - детектор "AFK". Если вы отправитесь на обед или позвоните по телефону или зайдите на собрание или засыпаете за своим столом, программа обнаружит, что вы были без дела, и даете вам диалог, когда вы возвращаетесь, чтобы классифицировать то, что вы делали, пока вы были в отъезде. Это полностью настраивается, поэтому он будет определять, было ли ваше время от компьютера продуктивным или отвлекающим.

enter image description hereenter image description here

Не доверяйте себе, чтобы продолжать работу? Он поставляется с функцией "Фокусное время". Здесь вы можете сказать программе, как долго вы хотите пристегиваться и работать, и за это время она заблокирует вас от использования сайтов и приложений, которые вы указали как отвлекающие. Если вы действительно не доверяете себе, вы можете сделать это так, чтобы вы не могли разблокировать их, пока ваше время не закончится.

focus

У меня был только один день, поэтому я с нетерпением жду, как моя производительность сравнивается день ото дня и недели с неделей. Поскольку это был мой первый день с этим, я был сильно пристегнут, потому что я был уверен в себе, что я делаю, но мне любопытно посмотреть, какие средние значения он устанавливает, и однажды я перестаю обращать на это внимание. Я знаю, что я обычно трачу много времени на общение с людьми на Триллиане и просмотр FFYa, чем показывает, что я сделал сегодня. Ill post some pictures, когда его собрал немного больше демографических данных.

О да, основная личная учетная запись бесплатна, и у вас есть возможность связать ее прямо с вашим аккаунтом Google (что я и сделал).

Наслаждайтесь одержимостью своими собственными навыками работы!


Я лично больше его не использую. Я понял, что для меня я могу только мотивировать так много производительности с этой игрой самосовершенствования и статистики. Лучшим долгосрочным решением было найти рабочие места, которые были более интересными, чем последние трендовые темы на скептической бирже.

Итак, я здесь, отвечая на ваш вопрос на работе.: Р

Ответ 4

Вот почти весь источник для приложения WinForms, который делает это. Обратите внимание, что это только добавляет время, когда Firefox имеет фокус.

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace FireFoxWatch
{
  public partial class Form1 : Form
  {
    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll", SetLastError = true)]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    private TimeSpan fireFoxElapsedTime = new TimeSpan();

    public Form1()
    {
      InitializeComponent();
    }

    // this handler is called each time the Timer component interval is reached.
    private void timer1_Tick(object sender, EventArgs e)
    {
      var wnd = GetForegroundWindow();
      uint procId;
      GetWindowThreadProcessId(wnd, out procId);

      var process = Process.GetProcessById((int)procId);
      if (process.ProcessName.Equals("firefox", StringComparison.CurrentCultureIgnoreCase))
        fireFoxElapsedTime += new TimeSpan(0, 0, 0, 0, timer1.Interval);

      //TODO: If fireFoxElapsedTime > Some predetermined TimeSpan, play a sound.
      // Right now it just updates a display label.
      label1.Text = fireFoxElapsedTime.ToString();
    }

    // start the timer when the form loads.
    private void Form1_Load(object sender, EventArgs e)
    {
      timer1.Start();
    }
  }
}

Единственная часть, которая не показана здесь, заключается в том, что я сделал приложение WinForms по умолчанию, а затем добавил компонент "Timer" из панели инструментов, который назван "timer1" в коде и был именем по умолчанию.

Приведенный выше код просто обновляет общее время на ярлыке winform, но вы можете легко добавить код для воспроизведения звука.

Ответ 5

Существует множество инструментов, таких как RescueTime и т.д., но вы можете использовать некоторый код .net, чтобы быстро сбить аппроксимацию.

Вам нужно будет опросить список процессов за определенный интервал,

psList = Process.GetProcesses() 

Вы можете использовать свойство starttime и заголовок главного окна для получения информации о каждом процессе. Я не уверен, как определить, какой из них активен или нет.