Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Cómo eliminar un icono del systray de una aplicación de terceros (https://www.clubdelphi.com/foros/showthread.php?t=31914)

SYWARE 22-05-2006 12:13:29

Cómo eliminar un icono del systray de una aplicación de terceros
 
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

Cerramos el proceso así
 
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

Nota
 
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 cuando añadas código en tus mensajes.
De paso puedes revisar la Guía de estilo, 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.

Código Delphi [-]
 
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


La franja horaria es GMT +2. Ahora son las 17:01:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi