Enero 2009
L M X J V S D
« Dic   Feb »
 1234
567891011
12131415161718
19202122232425
262728293031  

KeyLed

Debido a un accidente navideño con el teclado del ordenador, que incluyó el agravante de la sidra ecológica, tenemos desde hace poco uno nuevo, inalámbrico, que con estas ideas brillantes para abaratar costes, resulta que no tiene LEDs indicadores del estado de las teclas de bloqueo de mayúsculas, numérico y de desplazamiento. A resultas de esto, me ha picado el gusanillo de la programación rápida, y he creado una aplicacioncita en .NET que se encarga de controlar el estado de esas teclas e informa al usuario mediante un icono de notificación en la barra de sistema.

La verdad es que es una aplicación bastante simple, pero ya que hacía tiempo que no subía nada de programación al blog, me ha parecido interesante dejarla aquí por si interesa a alguien y, de paso para recabar la opinión de los incondicionales ;) . Su nombre es KeyLed.

También incluyo la parte relevante del código, que no es demasiado extenso: Se trata de un WinForm que muestra el estado de las teclas en varios checkboxes, y que al ser minimizada queda en el systray. En todo momento, muestra un bocadillo con el estado de las teclas de bloqueo, mediante el uso de un temporizador que va comprobándolo cada cierto tiempo (500 milisegundos). He probado utilizando un delegado para el evento Idle de la aplicación, pero no se refresca tan a menudo como debiera, de ahí el uso final del temporizador.

C#:
  1. {
  2.     public partial class KeyLed : Form
  3.     {
  4.         const int Interval = 500;
  5.  
  6.         public KeyLed()
  7.         {
  8.             InitializeComponent();
  9.  
  10.             KeyLedTimer.Interval = Interval;
  11.             KeyLedTimer.Enabled = true;
  12.         }
  13.  
  14.         [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
  15.         public static extern short GetKeyState(int keyCode);
  16.  
  17.         private void KeyNotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
  18.         {
  19.             //Hacemos visible el formulario
  20.             this.Show();
  21.             this.WindowState = FormWindowState.Normal;
  22.             //Ocultamos el icono de la bandeja de sistema
  23.             KeyNotifyIcon.Visible = false;
  24.         }
  25.  
  26.         private void KeyLed_Resize(object sender, EventArgs e)
  27.         {
  28.             //Si el estado actual de la ventana es "minimizado"...
  29.             if (this.WindowState == FormWindowState.Minimized)
  30.             {
  31.                 //Ocultamos el formulario
  32.                 this.Hide();
  33.                 //this.Visible = false;
  34.                 //Hacemos visible el icono de la bandeja del sistema
  35.                 KeyNotifyIcon.Visible = true;
  36.             }
  37.         }
  38.  
  39.         private void KeyLedTimer_Tick(object sender, EventArgs e)
  40.         {
  41.             this.CapsLockCheckBox.Checked = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
  42.             this.NumLockCheckBox.Checked = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
  43.             this.ScrollLockCheckBox.Checked = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;
  44.  
  45.             KeyNotifyIcon.ShowBalloonTip(Interval, "", _numLock + _capsLock + _scrollLock, ToolTipIcon.Info);           
  46.         }
  47.     }

Se me ocurren diversas mejoras, por ejemplo, que muestre la información de los leds cambiando el icono asociado al objeto NotifyIcon, de hecho funciona sin problema. Pero crear ocho iconos para esto me parece un pasote. Como con System.Drawing no he tenido que pelearme demasiado, a ver si existe una opción más eficiente que la que os presento. A partir del icono inicial, es posible usar el método ToBitmap() de la clase Icon para obtener un BMP en memoria sobre el que trabajar (por ejemplo, cambiando el color de un determinado pixel con SetPixel. Sin embargo, me parece poco adecuado tratar dinámicamente el icono, porque posiblemente sea mayor el tiempo de volver a dibujar el estado de los leds que cargar un icono distinto. ¿Alguna opinión al respecto? ¿Monto ambos sistemas y le hacemos pasar unos pocos benchmarks? ¿Merece la pena, realmente, todo esto? Jajaja.

Un saludo.

Actualización:
Acabo de darme cuenta, al encender el altavoz, del molesto efecto de "pop, pop" en el refresco del estado, al volver a pintar el bocadillo. Así las cosas, me da que no hay más opción que diseñarme el icono adecuado y actualizarlo dinámicamente. Así las cosas, vuelvo a la pregunta que planteaba al final de la entrada: ¿lo "repinto" en memoria, o cargo uno de una colección de iconos previamente almacenados?


Entradas relacionadas:
  • Un microgestor de descargas casero
  • Evitando fallos de carga dinámica de ensamblados
  • Ironías de la vida
  • Funciones Variadic
  • ALM, la gestión del ciclo de vida del software
  • Etiquetas: ,

    O.D.E., El día del Juicio

    Los que nos dedicamos al mundo de las nuevas tecnologías (y, en particular, a la informática) solemos "quejarnos" de que se nos etiquete con expresiones como "friki", "frikazo", "geek" o, simplemente, "bicho raro". Lo que es innegable es que, en ocasiones, nos lo ganamos a pulso.

    Este fin de semana podía ver en un blog amigo un vídeo, el de GigA: Todo es seguro, que nos caracteriza bastante bien. Y me ha hecho recordar otro que, no hace mucho, cumplía 10 añitos. Se trata del corto O.D.E., El día del juicio, que recrea bastante bien el ambientillo que se respiraba en la antigua ETSII de Granada, cuna de informáticos ya hoy, como mínimo, treintañeros. Aparte de la gracia geek del mismo, hay que tener en cuenta que se realizó contando con la colaboración de algunos profesores del centro y del propio alumnado. Imaginad la repercusión del vídeo cuando se proyectaba en El Día de la Escuela (a falta de patrón, buenas eran otras fiestas).

    Lo he vuelto a encontrar en Youtube (dónde si no), en el perfil del propio autor (Miguel Angel Sanchez Cogolludo, cuya visita tuvimos el honor de recibir hace unos meses, y del que me ha encantado ver que ha colaborado en producciones nacionales tan importantes como la reciente El lince perdido) y aquí os lo dejo para vuestro disfrute.

    ¡Saludos, y buen comienzo de semana!


    Entradas relacionadas:
  • Cancionero popular
  • Las cosas de los CAPTCHAs
  • Ay, Google, Google…
  • Hey, Hey, 16K!
  • De puente a puente…
  • Etiquetas: , ,