Cómo abrir el menú Inicio en Windows Mobile con C#

Cómo abrir el menú Inicio en Windows Mobile con C#

Microsoft ha matado a su sistema operativo Windows Mobile. Tras los numerosos retrasos en el desarrollo de Windows Mobile 7, aceptó sabiamente que el proyecto ya era un fracaso aún antes de ver la luz. iPhone y Android habían tomado la delantera, y amenazaban con dejar fuera de la carrera a quien años atrás había sido el líder. Así que en diciembre de 2008 apretó CTRL+ALT+DEL y comenzó a crear un nuevo sistema operativo para teléfonos inteligentes, apoyándose en tecnologías que ya tenían cierto recorrido: el núcleo de Windows Mobile (Windows CE 6.0 R3), la plataforma .NET, Silverlight y XNA Framework. De esta manera nació el Windows Phone 7.

En cuanto estuvieron disponibles las primeras betas del sistema y de las herramientas de desarrollo, Microsoft inició una frenética cruzada para captar desarrolladores de aplicaciones. Con su ya famoso grito de guerra Developers, developers, developers!, Steve Ballmer reconocía la importancia de este sector en su estrategia global. Windows Phone 7 no tendría futuro si no contaba con su propia tienda de aplicaciones, por lo que tendría que potenciar el ya existente Marketplace.

Microsoft ha intentado convencer a miles de desarrolladores de que el futuro está en WP7, y ha llevado a cabo numerosas acciones para facilitar el aprendizaje de la nueva plataforma tecnológica (Windows Phone 7 Development for Absolute Beginners, Windows Phone 7 Training Course). Después de todo, tiene una tienda que llenar de productos nuevos para ayer mismo. ¿Quiere decir ésto que ya hay que olvidarse, como desarrollador, de Windows Mobile? Quizás. Pero allá afuera hay un legado de aplicaciones antiguas que necesitan ser mantenidas, y lo cierto es que las nuevas tendencias en los desarrollos móviles están influyendo en los criterios de mantenimiento de aplicaciones que fueron creadas sobre una plataforma ya obsoleta.

Hoy en día se tiende a aprovechar todo el espacio físico que ofrece la pantalla del teléfono, maximizando el tamaño de la ventana de la aplicación. Por ejemplo, i-nigma, un difundido lector de códigos QR, utiliza este principio de diseño GUI.

Pero esta forma de diseñar la interfaz gráfica de la aplicación tiene un efecto colateral: la barra superior que muestra la hora, el menú de Inicio y otros datos, queda oculta bajo la ventana de la aplicación. Si el usuario quisiese desplegar el menú de Inicio para abrir otro programa tendría que cerrar antes la aplicación actual.

En cierta ocasión viví en primera persona esta historia, pues los usuarios estaban habituados a consultar el calendario y otras aplicaciones mientras utilizaban el programa que me había tocado mantener. Propuse maximizar la ventana, y así se hizo. Tras las primeras pruebas de los key users, las protestas no tardaron en llegar. Tenía dos opciones: o daba marcha atrás y dejaba el diseño de la interfaz como estaba anteriormente, o mantenía el nuevo diseño, más moderno, y ofrecía una solución que resolviera el nuevo problema.

Y la solución fue simular por programación que el usuario hacía click sobre el icono del menu Inicio. ¿Y cómo podemos abrir el menú Inicio en Windows Mobile con C#? Pongamos manos a la obra.

Los teclados que han sido creados específicamente para ser usados en ordenadores con Windows (Microsoft Natural Keyboard) tienen dos teclas especiales que muestran el logotipo de este sistema operativo. Cuando se presiona cualquiera de los dos, el resultado es el mismo: se despliega el menú Inicio. En un dispositivo con Windows Mobile podemos simular esta acción mediante la función keybd_event, que se encuentra en la dll no administrada coredll.dll, por lo que tendremos que utilizar P/Invoke para importarla a nuestro código C#:

[System.Runtime.InteropServices.DllImport(«coredll.dll», EntryPoint = «keybd_event», SetLastError = true)]

internal static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

Una vez que hemos importado esta función, sólo nos resta usarla con los valores adecuados. El código de la tecla izquierda con el logotipo de Windows (Left Windows key) es 0x5B. Tendremos que simular dos eventos: cuando se oprime la tecla, y cuando se libera. El código del primer evento es cero (0x0), mientras que el del  segundo es 2 (0x2). Ahora tendríamos que colocar sobre la interfaz de nuestra aplicación una imagen o un botón, y asociarle un evento que «oprima» y «libere» el menú de inicio. El código fuente en C# quedaría más o menos así:

const int VK_LWIN = 0x5B;
const int KEYEVENTF_KEYUP = 0x2;
const int KEYEVENTF_KEYDOWN = 0x0;

private void btnInicio_Click(object sender, EventArgs e)
{
    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
}

En este código de ejemplo hemos utilizado la declaración de varias constantes, pero podríamos haber utilizado el tipo enumerativo Keys, del espacio de nombres System.Windows.Forms. El código alternativo y equivalente quedaría así:

private void btnInicio_Click(object sender, EventArgs e)
{
    keybd_event((byte)Keys.LWin, 0, KEYEVENTF_KEYDOWN, 0);
    keybd_event((byte)Keys.LWin, 0, KEYEVENTF_KEYUP, 0);
}

Nótese que hemos necesitado realizar un typecast sobre el valor Keys.LWin, porque la función keybd_event() espera como primer parámetro un valor de tipo byte.

He aprovechado el código de ejemplo de la entrada Cómo hacer una llamada telefónica en Windows Mobile con C# para ampliarlo con esta nueva funcionalidad. Descarga la nueva versión y comprueba su utilidad.

Enlaces de interés:

Cómo abrir el menú Inicio en Windows Mobile con C#
El código fuente del proyecto

keybd_event
http://msdn.microsoft.com/en-us/library/aa928103.aspx

keybd_event (coredll)
http://pinvoke.net/default.aspx/coredll.keybd_event

Virtual-Key Codes
http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx

Keys Enumeration
http://msdn.microsoft.com/en-us/library/system.windows.forms.keys(VS.90).aspx

How Microsoft Hit CTRL+ALT+DEL on Windows Phone
http://www.wired.com/gadgetlab/2010/11/making-windows-phone-7/all/1

ACTUALIZACIÓN

Windows Phone OS 7.0: What’s inside?
http://www.zdnet.com/blog/microsoft/windows-phone-os-70-whats-inside/6110

¿Porqué sería posible instalar Windows Phone 7 en un smartphone Nokia?
http://logica10mobile.blogspot.com/2011/02/porque-seria-posible-instalar-windows.html