.net - uber - ¿Cómo calcular el tiempo total que un usuario gasta en una aplicación?
estructura de costos de una aplicacion movil (6)
Aquí está casi la fuente completa de una aplicación WinForms que hace esto. Tenga en cuenta que solo agrega tiempo cuando Firefox tiene foco.
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''s 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();
}
}
}
La única parte que no se muestra aquí es que hice una aplicación WinForms predeterminada, luego agregué un componente "Temporizador" de la caja de herramientas, que se llama "timer1" en el código, y era el nombre predeterminado.
El código anterior solo actualiza el tiempo total en una etiqueta winform, pero puede agregar código fácilmente para reproducir un sonido.
Quiero crear una aplicación que pueda calcular el tiempo total que el usuario (es decir, yo) dedicó a una aplicación en particular, por ejemplo, Firefox. Y esta aplicación debería mostrar un mensaje de advertencia si el usuario pasó mucho tiempo en Firefox (por ejemplo, 1 hora o más)
Razón : soy un desarrollador de VB.NET. Durante mis horas de trabajo, mi herramienta principal es Visual Studio y se supone que debo hacer codificación. Pero necesito Firefox de vez en cuando para acceder a Internet (particularmente SO y otros sitios) para encontrar soluciones para mis problemas de programación. El problema es que soy adicto al SO y SO me chupa el tiempo durante horas hasta que he olvidado que debo continuar codificando y no navegando por el sitio SO.
Mi pregunta : ¿Cómo calcular el tiempo total que un usuario gasta en una aplicación abierta como Firefox?
Actualizar:
Necesito reproducir una canción como mensaje de advertencia para mí mismo si me quedo demasiado tiempo con Firefox. Mi intención es crear un servicio de Windows o Windows para lograr esto.
Este tipo, Sateesh Arveti, codificó lo que está buscando: Active Application Watcher :
Hasta ahora, he visto tantas aplicaciones que mostrarán el uso del sistema en términos de memoria, procesador ... Pero, un usuario no quiere todos estos detalles. Puede esperar saber cuánto tiempo está gastando en cada aplicación, como el navegador, Winamp al final del día ... Esta aplicación ayudará al usuario a saber cuánto tiempo está gastando en cada aplicación cada día. Esta aplicación asume que la ventana, que está activa como la aplicación en la que el usuario está trabajando. Por lo tanto, registrará los detalles de la aplicación como el título de la ventana, el nombre del proceso y el tiempo empleado en ella en un archivo xml. Seguirá así hasta que se cierre la aplicación. Una vez que se cierre la aplicación, mostrará todos los detalles de la aplicación activa en un navegador con el formato adecuado.
Aquí está mi versión simple de vb.net (agregué el evento de alerta de sonido para FireFox).
Crear una clase de 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
Y luego crea un formulario con un temporizador y un cuadro de lista:
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
Refactorizar según sea necesario.
Esto no es un problema de programación. Este es un problema de disciplina. Mis consejos:
- En primer lugar, no confíe en la aplicación para decirle qué hacer.
- En segundo lugar, la aplicación puede advertirle pero, en última instancia, puede deshabilitarla y desactivarla.
- En tercer lugar, mi sugerencia para su problema real, es decir, sin disciplina y una mala ética de trabajo, es poner una pequeña pancarta frente a su monitor con este texto "Enfóquese en su trabajo" o "Codifíquelo ahora" o " SO es malo "
Hay muchas herramientas para hacer esto, como RescueTime, etc. ... pero puedes usar algún código .net para obtener una aproximación bastante rápido.
Tendría que sondear la lista de procesos en un intervalo dado,
psList = Process.GetProcesses()
Puede usar la propiedad de hora de inicio y el título de la ventana principal para obtener información sobre cada proceso. No estoy seguro de cómo decir cuál está activo o no.
Probablemente deberías probar el complemento de Firefox entonces,
Aquí está el enlace https://addons.mozilla.org/en-US/firefox/addon/timetracker/
Recomiendo inscribirse en RescueTime
Las razones simples son:
- Quiere que hayas preguntado. (El seguimiento del uso de la aplicación, el uso del navegador, distingue entre navegación web productiva e improductiva, le avisa si pasa demasiado tiempo desplacándose, etc.)
- Es increíblemente rápido de configurar (para que no pierdas más tiempo).
- Es gratis (para todas las cosas para las que lo necesitas).
Escribí una publicación en el blog sobre lo útil que fue esta herramienta una vez. Lo resumiré aquí.
Este es un programa que instala en su computadora que rastrea qué programa se enfoca a lo largo del día, y luego algunos. Se mide el tiempo de uso de cada aplicación y, al usar un navegador, también se mide el tiempo que invierte en sitios web individuales. Con un panel de control que le permite clasificar cada programa y sitios web específicos (y agrupar a otros), y le permite determinar si ese programa o sitio web está asociado con trabajo productivo o trabajo que distrae (o neutral). De manera predeterminada, sabe que varios sitios web y programas como Facebook y MSN distraen, y otros como Microsoft Word e Research son productivos, pero usted es libre de configurar todo eso:
Como puede ver arriba, tengo sitios de redes sociales, mensajeros y sitios de correo electrónico personales que me indican que distraen o distraen mucho mi trabajo, y que los programas y sitios que uso para el trabajo están listados como productivos. Hay varios sitios web separados de la navegación, pero todos los demás sitios visitados están agrupados en "Firefox", que es principalmente el tiempo que dedico a la investigación en línea para diferentes lenguajes de programación y paradigmas.
El programa toma toda esta información recopilada sobre su tiempo dedicado a usar su computadora y luego le brinda una descripción general de cómo está gastando su tiempo a lo largo del día:
Esto demuestra que dedico hasta 15 minutos cada dos horas a hacer algo que no sea el trabajo. Cuando estoy trabajando, puedes ver que pasé 3 horas investigando en línea, aproximadamente 2.5 haciendo desarrollo de software, 45 minutos con correos electrónicos comerciales, etc.
Cuando tomé un descanso y decidí ser improductivo, pasé la mayor parte del tiempo en FFYa (25 minutos).
Esta herramienta será excelente para reflexionar sobre la cantidad de trabajo que realizó en una hora, día, semana o mes determinado. Diferentes escalas de tiempo le permiten comparar y visualizar los momentos en que se encuentra en una situación crítica, en comparación con los tiempos en los que adquiere el hábito de aflojar. Lo que es aún mejor, es que te permite establecer metas para ti mismo.
Decide por ti mismo cuánto de tu día estás dispuesto a gastar en aflojarte y cuánto trabajo quieres hacer, e incluso programa una notificación emergente que te dirá si te vas por mal camino en una cantidad de formas predeterminadas .
Una de mis partes favoritas, es el detector “AFK”. Si sale a almorzar, recibe una llamada telefónica, asiste a una reunión o se queda dormido en su escritorio, el programa detectará que ha estado inactivo y le dará un diálogo cuando regrese para clasificar lo que estaba haciendo. mientras estabas fuera Esto también es completamente personalizable, por lo que se determinará si su tiempo fuera de la computadora fue productivo o una distracción.
¿No confías en ti mismo para mantener el trabajo? Viene con una función de "Tiempo de enfoque". Aquí, puede decirle al programa cuánto tiempo desea abrocharse el cinturón y trabajar, y durante ese tiempo, le impedirá usar los sitios y las aplicaciones que ha enumerado como una distracción. Si realmente no confías en ti mismo, puedes hacerlo para que no puedas desbloquearlos hasta que se acabe el tiempo.
Solo lo he tenido durante un día, así que espero ver cómo mi productividad se compara día a día y semana a semana. Como era mi primer día con él, me abroché bastante, porque era consciente de lo que estaba haciendo, pero tengo curiosidad por ver a qué tipo de promedios se establece una vez que deje de prestarle atención. Sé que por lo general pierdo mucho más tiempo chateando con gente de Trillian y navegando en FFYa de lo que se ve hoy. Voy a publicar algunas fotos cuando se recoge un poco más demografía.
Ah, sí, la cuenta personal básica es gratuita y tiene la opción de vincularla directamente a su inicio de sesión en Google (lo que hice).
¡Disfruta obsesionándote con tus propios hábitos de trabajo!
Yo personalmente ya no lo uso. Me di cuenta de que para mí, solo podía motivar tanta productividad con este juego de superación personal y estadísticas. Una mejor solución a largo plazo fue encontrar trabajos que fueran más interesantes que los temas de tendencias más recientes en Skeptics Exchange.
Dicho esto, aquí estoy, respondiendo tu pregunta en el trabajo. :pag