2010-11-16 14 views
11

Tengo una aplicación Delphi 2006 que se puede minimizar en un icono de bandeja y muestra varios mensajes de alerta mediante una sugerencia de globo sobre el icono de la bandeja.Globo insinúa que el icono de la bandeja de aplicaciones de Delphi sigue apareciendo indefinidamente

En algunas circunstancias, no sé cuándo, una sugerencia de globo mostrada previamente sigue apareciendo y no desaparecerá. Se visualiza durante el tiempo programado, se cierra y vuelve a aparecer inmediatamente.

Siempre es una sugerencia de globo de esta aplicación.

Si la aplicación muestra otra sugerencia de globo, que muestra el tiempo programado, se reanuda la sugerencia fantasma.

Es como si la pista estuviera atascada en una cola en alguna parte y no se eliminara. En ausencia de alguien con algo de inspiración (me doy cuenta de que es una posibilidad remota), ¿alguien sabe cómo purgar las pistas de los globos?

+0

cheque si tiene un temporizador que llama al icono de la bandeja para visualizar el globo o mejor aún Buscar en todo el proyecto para el nombre del componente icono de la bandeja y ver qué cuando se llama al procedimiento que muestra el balón. – ComputerSaysNo

+0

@Dorin. Gracias, hecho eso. El código que asigna a la propiedad BalloonHint de TTrayIcon definitivamente no se vuelve a llamar. – rossmcm

+0

¿Está probando esto en Windows XP? Me parece recordar que había un error con los globos proporcionados por MS en ese sistema operativo. De todos modos, verifique la respuesta aceptada en http://stackoverflow.com/questions/902642/how-to-hide-a-taskbar-balloon-at-will. Creo que eso podría ayudarte. –

Respuesta

2

¿Qué bandeja de entrada estás utilizando? El TCustomTrayIcon en "Vcl.ExtCtrls" usa TNotifyIconData para enviar el Popup al TrayIcon. Algunas propiedades requieren Windows Vista o posterior.

public 
    FData: TNotifyIconData; //Winapi.ShellAPI 

procedure TCustomTrayIcon.ShowBalloonHint; 
begin 
    FData.uFlags := FData.uFlags or NIF_INFO; 
    FData.dwInfoFlags := Cardinal(FBalloonFlags); 
    Shell_NotifyIcon(NIM_MODIFY, FData); //Refresh(NIM_MODIFY); 
end; 

Puede ver lo que está pasando al manejar los mensajes enviados por el trayicon.

NIN_BALLOONSHOW  = WM_USER + 2; 
NIN_BALLOONHIDE  = WM_USER + 3; 
NIN_BALLOONTIMEOUT = WM_USER + 4; 
NIN_BALLOONUSERCLICK = WM_USER + 5; 
0

Estoy enfrentando el mismo problema en VB.NET. Mi aplicación muestra mensajes de error a través de un balloontip en la bandeja del sistema. Cuando hay múltiples errores a la vez, el globo se adhiere a su tiempo de espera normal y muestra los errores uno tras otro. Parece que hay algún tipo de memoria intermedia que recuerda la cantidad real de veces que intenta mostrar el balloontip. Si deja de mostrar globos nuevos y espera lo suficiente, eventualmente se detendrá.

Mi objetivo sería cerrar el balloontip actual tan pronto como aparezca otro, pero aún no me he decidido a hacerlo. Entonces esta es solo la mitad de una solución.


[solución completa Añadido]

La solución completa era muy simple. Haga esto antes de mostrar un nuevo balloontip (Where Tray es su TrayIcon/NotifyIcon).

Tray.Visible = true; 
+0

difícil ver cómo esto se relaciona con la cuestión relativa a un Delphi aplicación –

+0

Es una solución para el mismo problema. Solo en código diferente.Traduzca mi línea de código en un código Delphi. ¿Sería eso un problema para el OP? – Martin

Cuestiones relacionadas