elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  WinWatcher (WinForms Application Source)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: WinWatcher (WinForms Application Source)  (Leído 4,066 veces)
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
WinWatcher (WinForms Application Source)
« en: 2 Diciembre 2012, 00:43 am »

Buenas,

Entre ayer y hoy se me dió por crear una pequeña tool que ni bien iniciada se minimiza al trayicon, y luego va "cronometrando" el tiempo que se pasa en una ventana. El registro lo guarda o bien en formato de texto (esta "hardcodeado" el formato), o bien en XML.

Para que se hagan una idea, el XML es más o menos así;

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ArrayOfWatchedWindow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  3.  <WatchedWindow>
  4.    <Executable>c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe</Executable>
  5.    <ProcessId>5492</ProcessId>
  6.    <WindowText>WinWatcher (Running) - Microsoft Visual Studio</WindowText>
  7.    <ElapsedTime>00:00:01</ElapsedTime>
  8.  </WatchedWindow>
  9.  <WatchedWindow>
  10.    <Executable>C:\Program Files (x86)\Google\Chrome\Application\chrome.exe</Executable>
  11.    <ProcessId>6048</ProcessId>
  12.    <WindowText>(37) Twitter - Google Chrome</WindowText>
  13.    <ElapsedTime>00:00:16</ElapsedTime>
  14.  </WatchedWindow>
  15.  <WatchedWindow>
  16.    <Executable>C:\Program Files (x86)\Google\Chrome\Application\chrome.exe</Executable>
  17.    <ProcessId>6048</ProcessId>
  18.    <WindowText>Foro de elhacker.net - Índice - Google Chrome</WindowText>
  19.    <ElapsedTime>00:01:13</ElapsedTime>
  20.  </WatchedWindow>
  21.  <WatchedWindow>
  22.    <Executable>C:\Program Files (x86)\Windows Media Player\wmplayer.exe</Executable>
  23.    <ProcessId>6276</ProcessId>
  24.    <WindowText>Reproductor de Windows Media</WindowText>
  25.    <ElapsedTime>00:00:03</ElapsedTime>
  26.  </WatchedWindow>
  27. </ArrayOfWatchedWindow>

La jerarquía en base a la cual se cronometran las ventanas es justamente la que se ve en el XML; Ejecutable > PID de proceso > Texto de ventana

Existen dos momentos en los que se vuelcan los datos a archivo;
  • Cada 15 minutos
  • Al cerrar la aplicación

Con click derecho en el icono del trayicon se puede cambiar la configuración y ver el log actual sin necesidad del volcado :)

Descarga de código fuente: http://bit.ly/WinWatcher (C# Visual Express 2010)

Le quería dar un uso personal, pero tal vez luego le haga alguna mejora y/o refactoring de código, porque se por ejemplo que tiene un bug conocido, si en un navegador se cambia de pestaña no se refleja hasta bien no se minimize y vuelva a restaurar la ventana, y esto es porque preferí hookear el cambio de ventana en lugar de hacer polling con un timer, así que al cambiar de tab no se entera :-X

Cualquier consulta y/o comentario ya saben

Saludos


« Última modificación: 2 Diciembre 2012, 00:52 am por Novlucker » En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Keyen Night


Desconectado Desconectado

Mensajes: 496


Nothing


Ver Perfil
Re: WinWatcher (WinForms Application Source)
« Respuesta #1 en: 2 Diciembre 2012, 02:04 am »

Bastante interesante, como con un simple StopWatcher y una idea se puede llegar a una aplicación, lo voy a tener un día activo para ver los tiempos por curiosidad :silbar: Aunque es obvio que el mayor uso es los compiladores :xD de Visual Studio y el Dev.


En línea

La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...
spiritdead

Desconectado Desconectado

Mensajes: 296


Ver Perfil
Re: WinWatcher (WinForms Application Source)
« Respuesta #2 en: 2 Diciembre 2012, 03:17 am »

Buenas,

Entre ayer y hoy se me dió por crear una pequeña tool que ni bien iniciada se minimiza al trayicon, y luego va "cronometrando" el tiempo que se pasa en una ventana. El registro lo guarda o bien en formato de texto (esta "hardcodeado" el formato), o bien en XML.

Para que se hagan una idea, el XML es más o menos así;

Código
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ArrayOfWatchedWindow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  3.  <WatchedWindow>
  4.    <Executable>c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe</Executable>
  5.    <ProcessId>5492</ProcessId>
  6.    <WindowText>WinWatcher (Running) - Microsoft Visual Studio</WindowText>
  7.    <ElapsedTime>00:00:01</ElapsedTime>
  8.  </WatchedWindow>
  9.  <WatchedWindow>
  10.    <Executable>C:\Program Files (x86)\Google\Chrome\Application\chrome.exe</Executable>
  11.    <ProcessId>6048</ProcessId>
  12.    <WindowText>(37) Twitter - Google Chrome</WindowText>
  13.    <ElapsedTime>00:00:16</ElapsedTime>
  14.  </WatchedWindow>
  15.  <WatchedWindow>
  16.    <Executable>C:\Program Files (x86)\Google\Chrome\Application\chrome.exe</Executable>
  17.    <ProcessId>6048</ProcessId>
  18.    <WindowText>Foro de elhacker.net - Índice - Google Chrome</WindowText>
  19.    <ElapsedTime>00:01:13</ElapsedTime>
  20.  </WatchedWindow>
  21.  <WatchedWindow>
  22.    <Executable>C:\Program Files (x86)\Windows Media Player\wmplayer.exe</Executable>
  23.    <ProcessId>6276</ProcessId>
  24.    <WindowText>Reproductor de Windows Media</WindowText>
  25.    <ElapsedTime>00:00:03</ElapsedTime>
  26.  </WatchedWindow>
  27. </ArrayOfWatchedWindow>

La jerarquía en base a la cual se cronometran las ventanas es justamente la que se ve en el XML; Ejecutable > PID de proceso > Texto de ventana

Existen dos momentos en los que se vuelcan los datos a archivo;
  • Cada 15 minutos
  • Al cerrar la aplicación

Con click derecho en el icono del trayicon se puede cambiar la configuración y ver el log actual sin necesidad del volcado :)

Descarga de código fuente: http://bit.ly/WinWatcher (C# Visual Express 2010)

Le quería dar un uso personal, pero tal vez luego le haga alguna mejora y/o refactoring de código, porque se por ejemplo que tiene un bug conocido, si en un navegador se cambia de pestaña no se refleja hasta bien no se minimize y vuelva a restaurar la ventana, y esto es porque preferí hookear el cambio de ventana en lugar de hacer polling con un timer, así que al cambiar de tab no se entera :-X

Cualquier consulta y/o comentario ya saben

Saludos

esta interesante, estudiare el fuente
En línea

Facilitador De Tareas - Task Simplifier (FDT)
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: WinWatcher (WinForms Application Source)
« Respuesta #3 en: 3 Diciembre 2012, 02:59 am »

Ahora tengo una versión recortada (lite), 0% configurable y con una implementación bastante más rústica pero que cumple con lo que necesito :)
Código:
MainForm => 00:00:02
Nuevos temas no leídos - Google Chrome => 00:00:12
Twitter - Google Chrome => 00:00:01
Google Reader (193) - Google Chrome => 00:00:01
WinWatcherLite (Running) - Microsoft Visual Studio => 00:00:02

Y cuando digo que está recortada, realmente lo está :P
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Forms;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Runtime.InteropServices;
  8. using System.Timers;
  9.  
  10. namespace WinWatcherLite
  11. {
  12.    public partial class MainForm : Form
  13.    {
  14.        string startTime;
  15.        string lastWindow;
  16.        string logFolder;
  17.        Dictionary<string, Stopwatch> windowLog;
  18.  
  19.        public MainForm()
  20.        {
  21.            InitializeComponent();
  22.            InitializeCustomObjects();
  23.        }
  24.  
  25.        private void InitializeCustomObjects()
  26.        {
  27.            startTime = DateTime.Now.ToString("ddMMyyyy_hhmmss");
  28.            lastWindow = string.Empty;
  29.            logFolder = Path.GetDirectoryName(Application.ExecutablePath);
  30.            windowLog = new Dictionary<string, Stopwatch>();
  31.  
  32.            System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
  33.            timer.Interval = 500;
  34.            timer.Tick += new EventHandler(timer_Tick);
  35.            timer.Start();
  36.  
  37.            System.Timers.Timer t = new System.Timers.Timer(60000);
  38.            t.Elapsed += new ElapsedEventHandler(OnTimedEvent);
  39.            t.Start();
  40.        }
  41.  
  42.        #region user32.dll
  43.  
  44.        [DllImport("user32.dll")]
  45.        public static extern IntPtr GetForegroundWindow();
  46.  
  47.        [DllImport("user32.dll")]
  48.        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);
  49.  
  50.        #endregion
  51.  
  52.        public void GetActiveWindow()
  53.        {
  54.            IntPtr win = GetForegroundWindow();
  55.            StringBuilder sb = new StringBuilder(255);
  56.            GetWindowText(win, sb, 256);
  57.  
  58.            string currentWindow = sb.ToString();
  59.            if (lastWindow != currentWindow)
  60.            {
  61.                if (windowLog.ContainsKey(lastWindow))
  62.                    windowLog[lastWindow].Stop();
  63.  
  64.                if (windowLog.ContainsKey(currentWindow))
  65.                    windowLog[currentWindow].Start();
  66.                else
  67.                {
  68.                    Stopwatch sw = new Stopwatch();
  69.                    sw.Start();
  70.                    windowLog.Add(currentWindow, sw);
  71.                }
  72.  
  73.                lastWindow = currentWindow;
  74.            }
  75.        }
  76.  
  77.        private void OnTimedEvent(object sender, ElapsedEventArgs e)
  78.        {
  79.            WriteLog();
  80.        }
  81.  
  82.        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
  83.        {
  84.            WriteLog();
  85.        }
  86.  
  87.        private void timer_Tick(object sender, EventArgs e)
  88.        {
  89.            GetActiveWindow();
  90.        }
  91.  
  92.        private void WriteLog()
  93.        {
  94.            string filePath = Path.Combine(logFolder, string.Format("WindowLog_{0}.txt", startTime));
  95.            StringBuilder sb = new StringBuilder();
  96.  
  97.            foreach (KeyValuePair<string, Stopwatch> registry in windowLog)
  98.            {
  99.                TimeSpan ts = registry.Value.Elapsed;
  100.                string elapsedTime = string.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
  101.                sb.AppendLine(string.Format("{0} => {1}", registry.Key, elapsedTime));
  102.            }
  103.  
  104.            using (StreamWriter sw = new StreamWriter(filePath))
  105.                sw.Write(sb.ToString());
  106.        }
  107.    }
  108. }
  109.  

Saludos
« Última modificación: 3 Diciembre 2012, 03:16 am por Novlucker » En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines