Poner un icono en el SysTray

2711 vistas

Delphi no propone ningún método estándar para añadir un icono en el SysTray.

Utilización de componentes dedicados
Existen muchos componentes que permiten hacer este trabajo. La libreria RxLib tiene uno y podéis descargarla des de esta misma web: [iurl=46]Componentes[/iurl]

Uso del API de Windows
No obstante es posible realizar este trabajo por nosotros mismos usando la función del API Shell_NotifyIcon



delphi
  1. function Shell_NotifyIcon(dwMessage: DWORD; lpData: PNotifyIconData): BOOL; stdcall;



Esta función permite añadir, modificar o quitar un icono del SysTray. Toma un parámetro de descripción del icono, el cual se tendrá que rellenar si queremos añadir un icono:



delphi
  1. Procedure TForm1.AnadirIcono;
  2. var
  3.   Info: TNotifyIconData;
  4. begin
  5.   { necesitamos rellenar la estructura Info con lo que queremos hacer }
  6.  
  7.   { cbSize contendrá el tamaño de la estructura }
  8.   Info.cbSize := SizeOf(Info);
  9.   { Wnd contendrá el Handle de la ventana que recibirá los mensajes de notificación de eventos del ratón }
  10.   Info.Wnd    := Handle;
  11.   { uID será el número de icono. Es útil si se añaden varios a la vez }
  12.   Info.uID    := 1;
  13.   { szTip contendrá el texto del "hint" }
  14.   Info.szTip  := 'Ejemplo de icono';
  15.   { hIcon contendrá el handle del icono a añadir }
  16.   Info.hIcon  := LosIconos[IconoEnCuros];
  17.   { uCallBackMessage contendrá el mensaje a devolver a la ventana dada por Wnd cuando se dispare un evento de ratón sobre el icono }
  18.   Info.uCallbackMessage := WM_MONICONE;
  19.   { uFlags contendrá la lista de campos usados dentro de la estructura entre los campos szTip, hIcon y uCallBackMessage}
  20.   Info.uFlags := NIF_TIP Or NIF_ICON Or NIF_MESSAGE;
  21.  
  22.   { llamada a la función de la API añadiendo el icono }
  23.   Shell_NotifyIcon( NIM_ADD, @Info );
  24. End;



Para quitarlo, simplemente tenemos que indicar el número de icono:



delphi
  1. Procedure TForm1.QuitarIconos;
  2. var
  3.   Info: TNotifyIconData;
  4. begin
  5.   { cuando eliminamos un icono, sólo son necesarios estos campos }
  6.   Info.cbSize := SizeOf(Info);
  7.   Info.Wnd    := Handle;
  8.   Info.uID    := 1;
  9.   Shell_NotifyIcon(NIM_DELETE,@Info);
  10. End;



También es posible generar mensages para controlar el clic de ratón (derecho, central e izquierdo), pero eso ya lo dehjamos al lector.