PDA

Ver la Versión Completa : Cómo eliminar un icono del systray de una aplicación de terceros


SYWARE
22-05-2006, 12:13:29
Agradeceré cualquier sugerencia sobre el siguiente tema:
Hay un programa de terceros que se sitúa automáticamente en el systray al iniciarse.
Este programa lo iniciamos y lo finalizamos desde un programa delphi.
El problema viene en que aunque matemos el proceso el icono permanece en el systray.
Si volvemos a iniciar el programa de terceros, aparece un segundo icono y así sucesivamente.
Al pasar el puntero del ratón por encima, desaparece.
El temas es que el programa delphi está activa las 24 horas del día los 365 días del año y que durante su ejecución puede iniciar y finalizar este programa de terceros 10 o 12 veces en un día. Al cabo de una semana tenemos más de 70 iconos .... al cabo de un año ... ni te cuento
Necesitaría eliminar el icono del SYSTRAY teniendo en cuenta que únicamente conozco el nombre del proceso.

Neftali [Germán.Estévez]
22-05-2006, 12:21:23
¿Cómo cerraís ese programa?
Ese problema suele venir propiciado porque al cerrar un programa no se ejecuta el código que elimina el icono; Al pasar el ratón por encima se "repinta" la barra y desaparece.

¿Cómo estáis cerrando el programa?

SYWARE
22-05-2006, 13:21:11
function Matar_proceso(ExeFileName: string): Integer;
// uses TlHelp32
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
Result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(
OpenProcess(PROCESS_TERMINATE,
BOOL(0),
FProcessEntry32.th32ProcessID),
0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

SYWARE
22-05-2006, 13:40:15
Cuando terminamos este mismo proceso desde el administrador de tareas de Windows, ocurre exactamente lo mismo.

Neftali [Germán.Estévez]
22-05-2006, 14:00:42
Por favor utiliza TAG's (http://neftali.clubdelphi.com/tmp/ResaltarSintaxisDelphi.png) cuando añadas código en tus mensajes.
De paso puedes revisar la Guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), para próximos post.

Neftali [Germán.Estévez]
22-05-2006, 14:04:51
Una pregunta, ¿Si el programa se cierra manualmente, el icono desaparece?
Me da la impresión de que tal vez al cerrar la aplicación de esa forma no se esté cerrando correctamente y se estén dejando de realizar determinadas cosas.

SYWARE
22-05-2006, 16:16:48
Cuando cerramos el programa de forma manual, el icono sí que desaparece.
Está claro que el programa se está encargando de eliminarlo del systray.
Para eliminarlo con el shell_notifyIcon precisaría conocer los parámetros para eliminarlo, especialmente el handle.


Procedure TForm1.QuitarIconos;
var
Info: TNotifyIconData;
begin
Info.cbSize := SizeOf(Info);
Info.Wnd := Handle;
Info.uID := 1;
Shell_NotifyIcon(NIM_DELETE,@Info);
End;


Si hubiese una manera de recorrerse todos los tray icon del systray e irlos comprobando por su nombre y obtener el handle para poder eliminarlo, estaría bien, pero seguramente hay algún método más sencillo.

Neftali [Germán.Estévez]
22-05-2006, 17:25:25
Puedes acceder a esa ventana con lo siguiente.
La barra de Inicio es la Ventana "Shell_TrayWnd", dentro de esa encontrarás otra de la clase "TrayNotifyWnd" y dentro de esta encontrarás otras dos:
* ToolbarWindow32: Correspondiente a los iconos que hay en el Tray.
* TrayClockWClass: Correspondiente al reloj.

Una vez que tienes al handle de esa ventana (FindWindows) prueba a recorrerla, repintarla,...
Ya nos dirás si tienes éxito.

SYWARE
22-05-2006, 17:36:17
Lo probaré y os diré algo,

Gracias