Как рассчитать общее время, затрачиваемое пользователем на приложение?
Я хочу создать приложение, которое сможет рассчитать общее время, которое пользователь (т.е. сам) потратил на конкретное приложение, например Firefox. И это приложение должно отображать предупреждающее сообщение, если пользователь потратил много времени на Firefox (например, 1 час и более)
Причина. Я разработчик VB.NET. Во время моего рабочего времени основным инструментом является Visual Studio, и я предполагаю сделать кодирование. Но мне иногда нужно, чтобы Firefox обращался к интернету (особенно SO и другим сайтам), чтобы найти решения для моих проблем с программированием. Проблема заключается в том, что я зависим от SO и SO сосет свое время в течение часов, пока не забыл, что я предполагаю продолжить кодирование и не просматривать SO-сайт.
Мой вопрос. Как рассчитать общее время, затрачиваемое пользователем на открытое приложение, например Firefox?
Update:
Мне нужно воспроизвести песню как предупреждение для себя, если я слишком долго останусь на Firefox. Я намерен создать winform или службу Windows для достижения этого
Ответы
Ответ 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 here]()
![enter 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 и заголовок главного окна для получения информации о каждом процессе. Я не уверен, как определить, какой из них активен или нет.
Ответ 6
Вероятно, вам следует попробовать добавить Firefox, затем,
здесь ссылка https://addons.mozilla.org/en-US/firefox/addon/timetracker/