![]() |
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. |
¿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? |
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; |
Nota
Cuando terminamos este mismo proceso desde el administrador de tareas de Windows, ocurre exactamente lo mismo.
|
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. |
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. |
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.
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. |
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. |
Lo probaré y os diré algo,
Gracias |
La franja horaria es GMT +2. Ahora son las 06:50:58. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi