Controlar eventos de Windows en C#

En .Net hay una clase que dispone de una serie de eventos propios del sistema operativo, que nos permite manejar o ser advertidos de ciertas modificaciones en el mismo, como podría ser el caso de modificaciones de hora, pantalla, etc. De esta forma podremos aplicarlas sobre la aplicación y que esta no haga extraños cuando se modifica algo en el sistema.

La clase encargada de eventualizar ciertas acciones del sistema operativo se encuentra dentro del espacio de nombres Microsoft.Win32 y se trata de la clase abstracta y no heredable SystemEvents. Esta clase provee de los diferentes tipos de eventos que listo a continuación con una breve descripción.

  • DisplaySettingsChanged: se produce cuando el usuario cambia la configuración de pantalla.
  • DisplaySettingsChanging: se produce cuando la configuración de pantalla esta cambiando.
  • EventsThreadShutdown: se produce antes de que finalice el subproceso que escucha los subprocesos del sistema.
  • InstalledFontsChanged: se produce cuando el usuario agrega o quita fuentes del sistema.
  • LowMemory: se produce cuando el sistema se queda sin memoria RAM disponible.
  • PaletteChanged: se produce cuando el usuario cambia a una aplicación que utiliza una paleta diferente.
  • PowerModeChanged: se produce cuando el usuario suspende o reanuda el sistema.
  • SessionEnded: se produce cuando el usuario cierra sesión o apaga el sistema.
  • SessionEnding: se produce cuando el usuario intenta cerrar sesión o apagar el sistema.
  • SessionSwitch: se produce cuando se cambia la sesión entre usuarios.
  • TimeChanged: se produce cuando se cambia la hora del sistema.
  • TimerElapsed: se produce cuando ha transcurrido el intervalo de un temporizador de Windows.
  • UserPreferenceChanged: se produce cuando cambian las preferencias del usuario.
  • UserPreferenceChanging: se produce cuando van a cambiar las preferencias del usuario.

De esta pequeña lista no he probado todas, pero si algunas con un correcto funcionamiento. Hay muchos eventos que pueden ser utilizados como el hecho de la memoria baja para lanzar el recolector de basura o el control de cierre de sistema para guardar los datos en memoria en un archivo.

Para utilizarlas se utilizaría el siguiente código:

using Microsoft.Win32;

//... LINEAS INTERMEDIAS

SystemEvents.TimeChanged += new System.EventHandler(this.message);

//... LINEAS INTERMEDIAS

public void message(object sender, EventArgs e) {
MessageBox.Show("Han cambiado la hora del sistema.");
}

Diferencias entre preg_match y ereg

Voy a explicar la diferencia entre estas dos funciones propias de PHP para evaluar y extraer información sobre cadenas mediante el uso de expresiones regulares o patrones.

Aparentemente estas 2 funciones son aparentemente iguales. Las diferencias entre ellas son mínimas, como por ejemplo que en preg_match es obligatorio establecer unas barras que delimitan el patrón, o que esta función devuelve un entero (int) de 0-n, en función de las coincidencias encontradas, mientras que ereg devuelve un booleano en función de si ha encontrado o no coincidencias.

Entonces. ¿Dónde radica la diferencia entre preg_match y ereg? Pues la principal diferencia ya que ambos también devuelven un array con las coincidencias por referencia, es la potencia. La función preg_match es muy potente y muy útil al igual que ereg. Generalmente se suele utilizar preg_match para extraer información de un texto y la función ereg para evaluar si un texto cumple un patrón o no, como es el caso de un email [a-zA-Z0-9]{1,}@[a-zA-Z0-9]{1,}.[a-zA-Z]{2,3}. El problema viene cuando realizamos un patrón relativamente complejo sobre un texto extenso, es ahí cuando vemos la verdadera diferencia de potencia entre preg_match y ereg. Si comparamos vemos que preg_match podría llegar a tardar 60 segundos en analizarlo (hablo por propia experiencia) mientras que el mismo patrón evaluado con ereg, tardaría unos 5 o 6 segundos.

En conclusión podríamos decir que preg_match es una función ideal para analizar y realizar patrones sobre textos relativamente pequeños, tal como el contenido de una pagina web por ejemplo, y ereg es para evaluar patrones rápidos como palabras o emails y cuando el patrón a evaluar es muy muy grande.

ACTUALIZACIÓN

Este artículo lo escribí hace casi 10 años. En ese momento era todo correcto. Con el tiempo la función ereg, heredada de PERL fue marcada como deprecated y de hecho ya no se encuentra en PHP7. Aunque ereg seguía siendo más rápida que preg_match, a esta última función le han añadido más versatilidad.

También comentar que la cadena de validación del email es un ejemplo, antiguo e incompleto.

Conectar a una url, webservice o REST en C#

Hoy en día se necesita conectar con páginas web, bien sea para extraer información de una página o para conectar contra un WebService. DotNet o .Net, nos provee de una serie de herramientas para la conexión contra WebServices, pero hay casos excepcionales, en los que necesitaremos conectarnos de una manera más arcaica y tradicional, al estilo de la librería cURL por ejemplo. En este caso mostrare un ejemplo de como conectarnos a una url de un WebService ficticio y como recoger su contenido para luego ser tratado. En primer lugar crearemos un String donde poner la url de la conexión. Seguidamente conectaremos utilizando los objetos HttpWebRequest y HttpWebResponse y generaremos un StreamReader con la respuesta. El código quedaría así:

String baseUri = "http://rutaalwebserice";
HttpWebRequest connection = (HttpWebRequest)HttpWebRequest.Create(baseUri);
connection.Method = "GET";
HttpWebResponse response = (HttpWebResponse)connection.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);

Ya tenemos nuestra variable sr (StreamReader) para poder utilizarla para trabajar con el supuesto XML o HTML devuelto. Es importante apuntar, que para utilizar estas librerías, necesitamos incluir los siguientes nombres de espacio:

using System.Web;
using System.Net;
using System.IO;
using System.Text;