La barra de tareas de Windows es una barra de controles, como las que existen en muchas aplicaciones, que se caracteriza por estar alojada directamente en el Escritorio y por ajustarse a uno de los bordes de la pantalla. Esta barra de botones puede ser tratada como una unidad, por ejemplo a la hora de ocultarla/mostrarla, pero en ella distinguimos al menos tres partes: el menú Inicio, al que tenemos acceso mediante el botón del mismo nombre; la lista de botones que representan a las aplicaciones y, en el extremo derecho o inferior, el área de notificaciones, en la cual se muestran diversos iconos.

A lo largo de este artículo se mostrará cómo podemos aprovechar la barra de tareas para nuestros propios fines, accediendo a ella desde cualquier programa que desarrollemos. Funcionalmente hablando, el artículo se divide en cuatro partes: manipulación global de la barra de tareas, gestión de los botones que representan a las aplicaciones, uso del espacio de notificación y, por último, cómo añadir nuevas entradas al menú Inicio. Aunque el código de los ejemplos propuestos está escrito en C++, concretamente Borland C++ Builder, lo cierto es que los conceptos pueden ser utilizados con cualquier otra herramienta de desarrollo, como puede ser Visual Basic o Delphi.

Todos los programas y ejemplos comentados en el artículo se pueden conseguir en la Web de PC World, en la dirección www.idg.es/pcworld/programas/listados.

La barra de tareas es una ventana

Como cualquier otro elemento visible de Windows, la barra de tareas no es más que otra ventana. Internamente, en la lista de clases de ventanas registradas, Windows identifica a este elemento con el nombre Shell_TrayWnd. Podemos, por lo tanto, obtener el identificador de ventana de la barra de tareas de forma sencilla, basta con facilitar ese nombre de clase a la función FindWindow en una sentencia similar a BarraTareas = FindWindow (“Shell_TrayWnd”, NULL); donde BarraTareas es una variable declarada previamente.

Disponiendo del identificador de ventana, es posible manipular la barra de tareas como si se tratase de cualquier otra ventana. Mediante la función ShowWindow se podría ocultar o volver a hacer visible, por ejemplo. Usando otras funciones de la API de Windows sería posible alterar su estilo, obtener sus ventanas hija, etc.

La barra de tareas cuenta con tres ventanas hija en su interior, cuyos identificadores se pueden recuperar mediante la función GetWindow. La primera de estas ventanas es un botón estándar, con el título Inicio, que al ser pulsado despliega un menú emergente con opciones que permiten iniciar diversas tareas. En segundo lugar tenemos una ventana de tipo ReBarWindow32, es decir, un control CoolBar. En él se alojan los botones que representan a las ventanas de primer nivel abiertas en un determinado momento. Si tenemos instalada la integración de interfaz de Internet Explorer 4, esta misma ventana puede tener otras secciones adicionales, por ejemplo con los iconos de accesos directos a las aplicaciones más usadas. La tercera ventana es la usada para mostrar los iconos de notificación y la hora.

Con un sencillo ejemplo comprenderemos mejor la relación y funcionamiento de la barra de tareas. Su finalidad es, simplemente, mostrar en una lista los nombres de clase de las diferentes ventanas hija existentes en ella. Además, dispondremos de dos botones que nos permitirán mostrar/ocultar tanto la barra de tareas completa como una de esas ventanas. En la figura 1 puede ver el aspecto del programa, cuyo código se muestra en el listado 1. Básicamente recorremos la lista de ventanas hija, mediante la función GetWindow, recuperando el nombre de clase de cada una. Observe que al añadir cada elemento se le asocia el identificador de la ventana correspondiente, lo cual nos permitirá recuperarlo posteriormente. Al pulsar el primer botón comprobamos si la barra de tareas está visible o no, invirtiendo su estado. La pulsación del segundo botón tiene el mismo efecto, aunque en este caso sobre la ventana correspondiente a la sección que se haya elegido en la lista.

Posición y estado de la barra de tareas

Aunque podemos manipular la barra de tareas como cualquier otra ventana, según se acaba de ver, lo cierto es que existen funciones y mensajes específicos en la API de Windows para trabajar con barras de botones de escritorio, que en definitiva es el tipo de elemento con el que estamos tratando. Concretamente disponemos de una función, llamada SHAppBarMessage, mediante la cual podemos conocer algunos datos de interés.

La citada función, en realidad, es de uso genérico para trabajo con barras de botones de escritorio. Precisa dos parámetros: una constante indicando el mensaje que se envía a la citada barra, en primer lugar, y una estructura de datos APPBARDATA, en segundo. El valor de retorno dependerá del mensaje enviado, como veremos enseguida.

El prototipo de la función SHAppBarMessage, así como la definición de la estructura APPBARDATA y las diversas constantes, se encuentran en el archivo de cabecera Shellapi.h, que deberemos incluir en nuestros programas. El tipo APPBARDATA, cuya definición puede ver seguidamente, cuenta con diversos miembros. En teoría sería preciso asignar a cbSize el tamaño de la estructura y a hWnd el identificador de la barra de tareas, pero en la práctica basta con ponerlo todo a cero antes de llamar a SHAppBarMessage.

struct APPBARDATA {

DWORD cbSize;

HWND hWnd;

UINT uCallbackMessage;

UINT uEdge;

RECT rc;

LPARAM lParam;

};

Mediante el mensaje ABM_GETTASKBARPOS se puede recuperar la posición de la barra de tareas. Tras la llamada, nos encontraremos con dos datos: uEdge contendrá una de las constantes comentadas en la tabla 1, indicando el margen en el que se encuentra la barra, mientras que rc permitirá conocer la posición y dimensiones exactas.

Pulsando el botón derecho del ratón sobre la barra de tareas se accede a un menú, de tipo emergente, con diversas opciones. Entre ellas existen dos que afectan a su funcionamiento visual: Siempre visible y Ocultar automáticamente. Es posible conocer desde un programa el estado de estas opciones, usando la función SHAppBarMessage conjuntamente con el mensaje ABM_GETSTATE. En este caso el valor de retorno será un entero, que puede ser cero, en cuyo caso las dos opciones están desactivadas, o bien contener las constantes ABS_ALWAYSONTOP y/o ABS_AUTOHIDE.

Un pequeño programa informativo

Veamos en la práctica cómo usar la función SHAppBarMessage para obtener información relativa a la barra de tareas. En este caso dicha información se muestra en una ventana, sin más. En la práctica, sin embargo, un programa podría usar estos datos para adaptar su propio funcionamiento según le interese.

En un formulario se han insertado cinco etiquetas de texto y dos controles TCheckBox. Estos últimos no tendrán título, su propiedad Caption estará vacía. Además tendrán la propiedad Enabled a False, de tal forma que no se podrán modificar durante la ejecución. Las tres primeras etiquetas de texto, según puede verse en la figura 2, contendrán un título que se completará durante la ejecución, mientras que las otras dos serán totalmente estáticas, actuando como títulos de los controles TCheckBox. Si se pregunta por qué se usan dos TLabel como título en lugar de asignar éste