Información emergente de la bandeja Delphi
¿Qué versión de Delphi estás usando? Los sistemas Delphi2005 y superiores ya tienen su propio control de bandeja. Si es una versión anterior, puede encontrar un control de terceros. El siguiente código es el código fuente del control que viene con Delphi2006. citarlo directamente, o puede registrarlo como control y directamente colocar el control en el formulario:
TCustomTrayIcon = class(TComponent)
privado
FAnimate : booleano;
FData: TNotifyIconData;
FIsClicked: booleano;
FCurrentIcon: TIcon
FIcon: TIcon; >
FIconList: TImageList;
FPopupMenu: TPopupMenu;
FTimer: TTimer
FHint:
FIconIndex; Entero;
FVisible: Booleano;
p>
FOnMouseMove: TMouseMoveEvent;
FOnClick: TNotifyEvent
FOnDblClick: TNotifyEvent;
FOnMouseDown: TMouseEvent;
FOnMouseUp: TMouseEvent;
FOnAnimate: TNotifyEvent
FBalloonHint: cadena; p> FBalloonTitle: cadena;
FBalloonFlags: TBalloonFlags;
clase var
RM_TaskbarCreated:
protegido
procedimiento SetHint(const Valor: cadena);
función GetAnimateInterval: Cardenal
procedimiento SetAnimateInterval(Valor: Cardenal);
procedimiento SetAnimate(Valor: Boolean);
procedimiento SetBalloonHint(const Valor: cadena);
función GetBalloonTimeout: Integer
procedimiento SetBalloonTimeout(Valor: Integer);
procedimiento SetBalloonTitle(const Valor: cadena);
procedimiento SetVisible(Valor: booleano);
tual;
procedimiento SetIconIndex(Valor: Entero);
procedimiento SetIcon(Valor: TIcon);
procedimiento SetIconList(Valor: TImageList);
procedimiento WindowProc(var Mensaje: TMessage); virtual;
procedimiento DoOnAnimate(Remitente: TObject);
propiedad Datos: TNotifyIconData leer FData; p>
p>
función Actualizar (Mensaje: Entero): sobrecarga;
público
constructor Crear (Propietario: TComponent); >
destructor Destruir;
procedimiento Actualizar;
procedimiento SetDefaultIcon
procedimiento ShowBalloonHint; propiedad Animate: lectura booleana FAnimate escritura SetAnimate valor predeterminado False
propiedad AnimateInterval: lectura cardinal GetAnimateInterval escritura SetAnimateInterval valor predeterminado
propiedad Sugerencia: cadena lee FHint escribe SetHint
<; p> propiedad BalloonHint: cadena lee FBalloonHint escribe SetBalloonHint;propiedad BalloonTitle: cadena lee FBalloonTitle escribe SetBalloonTitle
propiedad BalloonTimeout: entero lee GetBalloonTimeout escribe SetBalloonTimeout predeterminado
<; p> propiedad BalloonFlags: TBalloonFlags lee FBalloonFlags escribe FBalloonFlags por defecto bfNone;Icono de propiedad: TIcon lee FIcon escribe SetIcon;
Iconos de propiedad: TImageList lee FIconList escribe SetIconList;
propiedad Ic
onIndex: entero leer FIconIndex escribir SetIconIndex valor predeterminado 0;
propiedad PopupMenu: TPopupMenu leer FPopupMenu escribir FPopupMenu
propiedad Visible: booleano leer FVisible escribir SetVisible valor predeterminado False; > propiedad OnClick: TNotifyEvent lee FOnClick escribe FOnClick;
propiedad OnDblClick: TNotifyEvent lee FOnDblClick escribe FOnDblClick
propiedad OnMouseMove: TMouseMoveEvent lee FOnMouseMove escribe
propiedad; OnMouseUp: TMouseEvent lee FOnMouseUp escribe FOnMouseUp;
propiedad OnMouseDown: TMouseEvent lee FOnMouseDown escribe FOnMouseDown;
propiedad OnAnimate: TNotifyEvent lee FOnAnimate escribe FOnAnimate;
fin;
TTrayIcon = clase(TCustomTrayIcon)
publicado
propiedad Animate;
propiedad AnimateInterval;
propiedad Hint;
propiedad BalloonHint;
propiedad BalloonTitle;
propiedad BalloonTimeout;
propiedad BalloonFlags
propiedad Icon;
iconos de propiedad;
propiedad IconIndex;
propiedad PopupMenu;
propiedad Visible;
propiedad OnDblClick;
propiedad OnMouseMove
propiedad OnMouseUp;
end;
{ TTrayIcon}
constructor TCustomTrayIcon.Create(Propietario: TComponent);
comenzar
heredado;
FAnimate := False
FBalloonFlags := bfNone
BalloonTimeout : = 3000;
FIcon:= TIcon.Create;
FCurrentIcon:= TIcon.Create;
FTimer:= TTimer.Create(Nil); p>
p>
FIconIndex:= 0;
FVisible:= False;
FIsClicked:= False;
FTimer.Enabled: = False;
p>FTimer.OnTimer:= DoOnAnimate;
FTimer.Interval:= 1000;
si no (csDesigning en ComponentState) entonces p>
comenzar
FillChar(FData, SizeOf(FData), 0);
FData.cbSize:= SizeOf(FData);
FData .Wnd:= Classes.AllocateHwnd (WindowProc);
FData.uID := FData.Wnd
FData.uTimeout := 3000; hIcon := FCurrentIcon.Handle;
FData.uFlags:= NIF_ICON o NIF_MESSAGE;
FData.uCallbackMessage:= WM_SYSTEM_TRAY_MESSAGE;
StrPLCopy(FData.szTip, Application.Title, SizeOf(FData .szTip) - 1);
si Longitud(Application.Title) gt; entonces
FData.uFlags:= FData.uFlags o NIF_TIP;
Actualizar;
finalizar;
finalizar;
destructor TCustomTrayIcon.Destroy;
comenzar
si no (csDesigning en ComponentState) entonces
Refresh(NIM_DELETE);
FCurrentIcon.Free
FIcon.Free;
FTimer.Free;
Classes.DeallocateHWnd(FData.Wnd);
heredado
fin
procedimiento TCustomTrayIcon; .SetVisible(Valor
ue: booleano);
comenzar
si FVisible lt;gt; Valor entonces
comenzar
FVisible := Valor; p> p>
si (no FAnimate) o (FAnimate y FCurrentIcon.Empty) entonces
SetDefaultIcon;
si no (csDesigning en ComponentState) entonces
comenzar
si FVisible entonces
comenzar
si no Actualizar(NIM_ADD) entonces
generar EOutOfResources.Create(STrayIconCreateError);
p>final
si no (csLoading en ComponentState) entonces
comenzar
si no Actualizar (NIM_DELETE) entonces p>
elevar EOutOfResources.Create(STrayIconRemoveError);
end;
si FAnimate entonces
FTimer.Enabled := Valor
fin ;
fin;
fin;
procedimiento TCustomTrayIcon.SetIconList(Valor: TImageList);
comienzo p>
si FIconList lt; Valor entonces
comenzar
FIconList := Valor;
si no (csDesigning en ComponentState) entonces p>
comenzar
si está asignado (FIconList) entonces
FIconList.GetIcon(FIconIndex, FCurrentIcon)
más
SetDefaultIcon ;
Actualizar
fin
fin
final
procedimiento TCustomTrayIcon.SetHint(const; Valor: cadena) ;
comenzar
si CompareStr(FHint, Value) lt; entonces
comenzar
FHint; = Valor;
StrPLCopy(FData.szTip, FHint
, SizeOf(FData.szTip) - 1);
si Longitud(Hint) gt; 0 entonces
FData.uFlags:= FData.uFlags o NIF_TIP
else
FData.uFlags:= FData.uFlags y no NIF_TIP
Actualizar
fin
fin; p>
fin p>
función TCustomTrayIcon.GetAnimateInterval: Cardinal;
comenzar
Resultado:= FTimer.Interval;
fin;
procedimiento TCustomTrayIcon.SetAnimateInterval(Valor: Cardinal);
comenzar
FTimer.Interval:= Valor;
fin;
procedimiento TCustomTrayIcon .SetAnimate(Valor: Booleano);
comenzar
si FAnimate lt;gt Valor entonces
comenzar
<; p> FAnimate := Valor;si no (csDesigning en ComponentState) entonces
comenzar
si (FIconList lt; gt; nil) y (FIconList. Count gt; 0) y Visible entonces
FTimer.Enabled := Valor;
si (no FAnimate) y (no FCurrentIcon.Empty) entonces
FIcon .Assign(FCurrentIcon);
end;
end;
end;
{ Controlador de mensajes para la ventana de notificación del shell oculto. La mayoría de los mensajes
utilizan WM_SYSTEM_TRAY_MESSAGE como ID del mensaje, con WParam como ID de los datos del icono de notificación del shell
LParam es un ID de mensaje para el mensaje real, por ejemplo,
WM_MOUSEMOVE Otro mensaje importante es WM_ENDSESSION, que le indica al shell
icono de notificación que se elimine para que Windows pueda cerrarse.
Envíe los eventos habituales para este.
e mensajes del mouse. También interpola el evento OnClick
cuando el usuario hace clic en el botón izquierdo, y abre el menú, si hay
uno, para eventos de clic derecho }
procedimiento TCustomTrayIcon.WindowProc(var Message: TMessage);
{ Devuelve el estado de las teclas mayúsculas }
función ShiftState: TShiftState;
comenzar
Resultado:= [];
si GetKeyState(VK_SHIFT) lt; entonces
Incluir(Resultado, ssShift);
si GetKeyState(VK_CONTROL) lt; 0 entonces
Incluir(Resultado, ssCtrl);
si GetKeyState(VK_MENU) lt; 0 entonces
Incluir( Resultado, ssAlt);
final;
var
Punto: TPoint;
Cambio: TShiftState; >comenzar
caso Mensaje.Msg de
WM_QUERYENDSESSION:
Mensaje.Resultado:= 1;
WM_ENDSESSION:
comenzar
si TWmEndSession(Message).EndSession luego
Actualizar(NIM_DELETE);
finalizar
WM_SYSTEM_TRAY_MESSAGE:
comenzar
caso Message.lParam de
WM_MOUSEMOVE:
comenzar
si está asignado (FOnMouseMove) entonces
comenzar
Shift := ShiftState;
GetCursorPos(Punto);
FOnMouseMove(Self, Shift, Point.X, Point. Y);
finalizar
finalizar
WM_LBUTTONDOWN:
comenzar
si está asignado (FO)
nMouseDown) luego
comenzar
Shift := ShiftState [ssLeft];
GetCursorPos(Point
FOnMouseDown(Self, mbMiddle); , Mayús, Punto:
comenzar
Mayús:= ShiftState [ssLeft]
GetCursorPos(Punto); y Asignado(FOnClick) entonces
comenzar
FOnClick(Self);
FIsClicked := False
final; >
si está asignado (FOnMouseUp) entonces
FOnMouseUp(Self, mbLeft, Shift, Point.X, Point.Y);
fin;
WM_RBUTTONDOWN:
comenzar
si está asignado (FOnMouseDown) entonces
comenzar
Shift := ShiftState [ssRight]
;GetCursorPos( Punto);
FOnMouseDown(Self, mbRight, Shift, Point.X, Point.Y
fin
fin;
WM_RBUTTONUP:
comenzar
Shift:= ShiftState [ssRight]
GetCursorPos(Point
si está asignado (FOnMouseUp) entonces
FOnMouseUp(Self, mbRight, Shift, Point.X, Point.Y);
si está asignado (FPopupMenu) entonces
comenzar
SetForegroundWindow(Aplicación
ion.Handle);
Application.ProcessMessages;
FPopupMenu.AutoPopup:= False;
FPopupMenu.PopupComponent:= Propietario;
FPopupMenu.Popup(Punto.x, Punto.y);
fin
fin
WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK:
si está asignado (FOnDblClick) entonces
FOnDblClick(Self);
WM_MBUTTONDOWN:
comienza
si está asignado (FOnMouseDown) entonces
comenzar
Shift := ShiftState [ssMiddle];
GetCursorPos(Point);
FOnMouseDown(Self, mbMiddle, Shift, Punto. > si está asignado (FOnMouseUp) entonces
comenzar
Shift := ShiftState [ssMiddle]
GetCursorPos(Point). > FOnMouseUp (Self, mbMiddle, Shift, Point. p> comenzar
FData.uFlags:= FData.uFlags y no NIF_INFO;
finalizar;
finalizar ;
fin;
si (Message.Msg = RM_TaskBarCreated) y Visible entonces
Actualizar(NIM_ADD);
fin;
p>
procedimiento TCustomTrayIcon.Refresh;
comenzar
si no (csDesigning en ComponentState) entonces
comenzar
FData.hIcon:= FCurrentIcon.Handle;
si es visible, entonces
Refresh(NIM_MODIFY);
end;
end;
función TCustomTrayIcon.Refresh(Mensaje: entero): Booleano;
comenzar
Resultado:= Shell_NotifyIcon(Mensaje, @FData;
finalizar
procedimiento TCustomTrayIcon.SetIconIndex(Valor); : Entero);
comenzar
si FIconIndex lt; gt; Valor entonces
comenzar
FIconIndex := Valor; >
si no (csDesigning en ComponentState) entonces
comenzar
si está asignado (FIconList) entonces
FIconList.GetIcon(FIconIndex, FCurrentIcon);
Actualizar;
finalizar;
finalizar;
finalizar;
procedimiento TCustomTrayIcon.DoOnAnimate(Remitente: TObject
comenzar
si está asignado (FOnAnimate) luego
FOnAnimate(Self);
si está asignado (FIconList) y (FIconIndex); lt; FIconList.Count - 1) entonces
IconIndex:= FIconIndex 1
else
IconIndex:= 0;
Actualizar;
fin;
procedimiento TCustomTrayIcon.SetIcon(Valor: TIcon);
comienzo
FIcon.Assign(Valor); p>
p>
FCurrentIcon.Assign(Value);
Actualizar;
fin
procedimiento TCustomTrayIcon.SetBalloonHint(const Valor: string);
p>
comenzar
si CompareStr(FBalloonHint, Value) lt; entonces
comenzar
FBalloonHint:= Valor;
StrPLCopy(FData.szInfo, FBalloonHint, SizeOf(FData.szInfo) - 1
Actualizar(NIM_MODIFY
fin
);fin;
procedimiento TCustomTrayIcon.SetDefaultIcon;
comenzar
si no es FIcon.Empty entonces
FCurrentIcon.Assign(FIcon )
else
FCurrentIcon.Assign(Application.Icon
Actualizar
fin; procedimiento TCustomTrayIcon.SetBalloonTimeout(Valor: Entero);
comenzar
FData.uTimeout:= Valor;
fin;
función TCustomTrayIcon .GetBalloonTimeout: Entero;
comienzo
Resultado:= FData.uTimeout;
final
procedimiento TCustomTrayIcon.ShowBalloonHint
p>
p>
comenzar
FData.uFlags:= FData.uFlags o NIF_INFO;
FData.dwInfoFlags:= Integer(FBalloonFlags);
Actualizar (NIM_MODIFY);
fin;
procedimiento TCustomTrayIcon.SetBalloonTitle(const Valor: cadena
comenzar
); si CompareStr(FBalloonTitle, Value) lt; 0 entonces
comenzar
FBalloonTitle:= Valor;
StrPLCopy(FData.szInfoTitle, FBalloonTitle, SizeOf( FData.szInfoTitle) - 1);
Actualizar (NIM_MODIFY
fin
final;
// Este código es para notificar a la aplicación cuando se reconstruye la ventana de notificación
TCustomTrayIcon.RM_TaskBarCreated:= RegisterWindowMessage('TaskbarCreated');