Prueba con este código. Parte de él lo utilicé hace muchos años, he probado a compilarlo con versiones más actuales y parece que aún funciona.
#include "fivewin.ch"
Function Main()
Local oTimer , oDlg, oTray, oIcon
ServiceProcess (1)
DEFINE WINDOW oDlg TITLE "Servicio"
DEFINE ICON oIcon FILE "..\icons\fivewin.ico"
DEFINE TIMER oTimer INTERVAL 6000 OF oDlg ACTION Msginfo ('Busco')
ACTIVATE WINDOW oDlg ;
ON INIT (oTray := (TTrayIcon():New(oDlg,oIcon,"Esperando ...",{||Msginfo ('Click')},{|nRow,nCol|MenuTray(oDlg,nRow,nCol,oTray)})),;
oTimer:ACTIVATE());
VALID oTray:End()
Return (nil)
FUNCTION MenuTray( oDlg,nRow, nCol, oTray )
LOCAL oMenu
MENU oMenu POPUP
MENUITEM "Mostrar" ACTION oDlg:Show(), oDlg:SetFocus()
MENUITEM "Ocultar" ACTION oDlg:Hide()
SEPARATOR
MENUITEM "Cerrar Programa" ACTION Iif(MsgNoYes("Desea Salir","Atención"),Finalizar(),)
ENDMENU
ACTIVATE POPUP oMenu AT nRow, nCol OF oTray:oWnd
RETURN NIL
Function Finalizar()
Quit
Return Nil
//------------------------------
Function ServiceProcess( mode )
//------------------------------
Local nProcessId := 0
Default mode := 0
nProcessId := GCP( )
If Abs( nProcessId ) > 0
RSProcess( nProcessId, mode )
Endif
Return (nil)
//----------------------------------------------------
DLL32 FUNCTION RSProcess(npID AS LONG ,;
nMode AS LONG ) AS LONG ;
FROM "RegisterServiceProcess" LIB "kernel32.DLL"
//----------------------------------------------------
//----------------------------------------------------
DLL32 FUNCTION GCP() AS LONG;
FROM "GetCurrentProcessId" LIB "kernel32.dll"
//----------------------------------------------------