Vamos a programar #73 - Message Sender 1.0.1 (POC)

Hola de nuevo a todos, el día de hoy vamos a ver una pequeña actualización para Message Sender.

El otro día mientras revisaba los mensajes en twitter, vi uno de alguien que me comentó que quería hacer uso de Message Sender, pero en vez de solo visualizar la información de ITunes, quería saber cual era la ventana que tenia el foco. En windows se dice que una ventana "tiene el foco" cuando está activa, es decir la ventana que estamos usando.
La ventana de Chrome es la que "tiene el foco"
La idea me pareció interesante así que revise el código que me envió. El código que veremos no es mio, yo solamente haré la correcciones para que funcione.

En este post veremos cómo es el código en C# que se usa para obtener el nombre de la ventana que es la que está activa.

Para poder obtener la información que necesitamos, recurriremos a la API de windows. ya que es muy extensa y me da flojera memorizar toda (si hay alguien que sepa TODA la API de windows con gusto le invito una cerveza), podemos buscar en la página de pinvoke.NET, aquí hay mucha de la API ya documentada con algunos ejemplo que nos pueden resultar de utilidad.

En este caso vamos a necesitar la función "GetWindowText()" que cómo su nombre lo sugiere, sirve para obtener el titulo de la ventana activa. Está funcion se encuentra en la biblioteca "user32.dll" y para poder acceder a ella, necesitamos código cómo el que sigue:
//{...}
		[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
		static extern IntPtr GetForegroundWindow();
		[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
		static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
		[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
		static extern int GetWindowTextLength(IntPtr hWnd); 
//{...}

Para poder usar las interfaces, primero debemos de importar el nombre de espacios

using System.Runtime.InteropServices;

Esto nos permitirá acceder a los atributos de la siguiente manera

//{...}
		private string GetCaptionOfActiveWindow()
		{
			string strTitle = string.Empty;
			IntPtr handle = GetForegroundWindow();
			int intLength = GetWindowTextLength(handle) + 1;
			StringBuilder stringBuilder = new StringBuilder(intLength);
			if (GetWindowText(handle, stringBuilder, intLength) > 0)
			{
				strTitle = stringBuilder.ToString();
			}
			return strTitle;
		}
//{..}

Con eso bastará con llamar la función "GetCaptionOfActiveWindow()" cada vez que queramos saber cual es la ventana activa.

Y bien, por ahora es todo, si quieres puedes probar a "unir" el código de Message Sender que ya teníamos con anterioridad con este fragmento, en el siguiente post veremos cómo implementar el código en C# y en arduino.



Los leo luego.

No hay comentarios.