I did it more no show ballon
#INCLUDE "Fivewin.CH"
STATIC oApp, oTray, oIcon
FUNCTION TESTIT()
LOCAL oIcon1
DEFINE ICON oIcon FILE "..\icons\fivewin.ICO"
DEFINE ICON oIcon1 FILE "..\icons\folder.ico"
DEFINE WINDOW oApp TITLE "Icon Tray Class for FiveWin! from Jim Gale" ICON oIcon
ACTIVATE WINDOW oApp ;
ON INIT oTray := TTrayIcon():New(oApp,oIcon,"Testing tray ...",{||MsgInfo("Left CLick")},{|nRow,nCol|MenuTray(nRow,nCol,oTray)}) ;
VALID oTray:End() ;
ON RIGHT CLICK GetNotifyIconData( oApp, 1, WM_TASKBAR, oIcon:hIcon, "text of the tooltip", "The Title" )
RETURN NIL
FUNCTION MenuTray( nRow, nCol, oTray )
LOCAL oMenu
MENU oMenu POPUP
MENUITEM "Show" ACTION oApp:Show(), oApp:SetFocus()
MENUITEM "Hide" ACTION oApp:Hide()
SEPARATOR
MENUITEM "Close Application" ACTION oApp:end()
ENDMENU
ACTIVATE POPUP oMenu AT nRow, nCol OF oTray:oWnd
RETURN NIL
and no show error
my ttray.prg
#INCLUDE "Fivewin.CH"
#INCLUDE "Struct.CH"
#define NIM_ADD 0
#define NIM_MODIFY 1
#define NIM_DELETE 2
#define NIF_MESSAGE 1
#define NIF_ICON 2
#define NIF_TIP 4
#define WM_LBUTTONDBLCLK 515 // 0x203
CLASS TTrayIcon
DATA oTray
DATA oWnd
DATA oIcon
DATA cCaption
DATA bLClicked
DATA bRClicked
DATA bMMoved
DATA bLDblClick
DATA bLButtonUp
DATA bRButtonUp
METHOD New() CONSTRUCTOR
METHOD End()
METHOD Refresh( oIcon, cTip, lAdd )
METHOD SetIcon( oIcon, cToolTip ) INLINE ::Refresh( oIcon, cToolTip )
METHOD SetText( cTitle ) INLINE ::Refresh( , cTitle )
METHOD Command( nWParam, nLParam )
ENDCLASS
METHOD Command( nWParam, nLParam ) CLASS TTrayIcon
LOCAL a := GetCursorPos()
DO CASE
CASE nLParam == WM_LBUTTONDOWN .AND. !EMPTY(::bLClicked)
EVAL(::bLClicked,a[1],a[2])
CASE nLParam == WM_RBUTTONDOWN .AND. !EMPTY(::bRClicked)
EVAL(::bRClicked,a[1],a[2])
CASE nLParam == WM_MOUSEMOVE .AND. !EMPTY(::bMMoved)
EVAL(::bMMoved,a[1],a[2])
CASE nLParam == WM_LBUTTONDBLCLK .AND. !EMPTY(::bLDblClick)
EVAL(::bLDblClick,a[1],a[2])
CASE nLParam == WM_LBUTTONUP .AND. !EMPTY(::bLButtonUp)
EVAL(::bLButtonUp,a[1],a[2])
CASE nLParam == WM_RBUTTONUP .AND. !EMPTY(::bRButtonUp)
EVAL(::bRButtonUp,a[1],a[2])
OTHERWISE
// ? nLParam
ENDCASE
RETURN NIL
METHOD New(oWnd,oIcon,cTip,uLClick,uRClick,uMMoved,uLDblClick,uLButtonUp,uRButtonUp) CLASS TTrayIcon
DEFINE WINDOW ::oWnd STYLE NOR( WS_POPUP, WS_DISABLED ) FROM 0,0 TO 0,0 OF oWnd
ACTIVATE WINDOW ::oWnd ON INIT ::oWnd:Hide()
DEFAULT oIcon := oWnd:oIcon ,;
cTip := oWnd:cCaption ,;
uLClick := oWnd:bLClicked ,;
uRClick := oWnd:bRClicked ,;
uLDblClick := oWnd:bLDblClick ,;
uMMoved := oWnd:bMMoved ,;
uLDblClick := oWnd:bLDblClick ,;
uRButtonUp := oWnd:bRButtonUp ,;
uLButtonUp := oWnd:bLButtonUp
::Refresh(oIcon,cTip,.T.)
::bLClicked = uLClick
::bRClicked = uRClick
::bMMoved = uMMoved
::bLDblClick = uLDblClick
::bRButtonUp = uRButtonUp
::bLButtonUp = uLButtonUp
::oWnd:bTaskBar = { | nWParam, nLParam | ::Command( nWParam, nLParam ) }
RETURN Self
METHOD Refresh( oIcon, cTip, lAdd ) CLASS TTrayIcon
local oTray, c
DEFAULT oIcon := ::oIcon ,;
cTip := ::cCaption ,;
lAdd := .F.
DEFAULT lAdd := .F.
STRUCT oTray
MEMBER cbSize AS LONG
MEMBER hWnd AS LONG
MEMBER uID AS LONG
MEMBER uFlags AS LONG
MEMBER uCallMsg AS LONG
MEMBER hIcon AS LONG
MEMBER cTip AS STRING LEN 64
ENDSTRUCT
oTray:cbSize := oTray:SizeOf()
oTray:hWnd := ::oWnd:hWnd
oTray:uID := 1
oTray:uFlags := nOr( NIF_ICON, NIF_MESSAGE, If( ! Empty( cTip ), NIF_TIP, 0 ) )
oTray:uCallMsg := WM_TASKBAR
oTray:hIcon := oIcon:hIcon
oTray:cTip := cTip + Chr( 0 )
c := oTray:cBuffer
Shell_NotifyIcon( If( lAdd, NIM_ADD, NIM_MODIFY ), @c )
oTray:cBuffer := c
::oTray = oTray
::oIcon = oIcon
::cCaption = cTip
RETURN NIL
METHOD End() CLASS TTrayIcon
LOCAL c
IF !EMPTY(::oTray)
::oTray:uFlags := 0
c := ::oTray:cBuffer
Shell_NotifyIcon(NIM_DELETE,@c)
::oTray:cBuffer := c
ENDIF
IF !EMPTY(::oWnd)
::oWnd:End()
ENDIF
IF !EMPTY(::oIcon)
::oIcon:End()
ENDIF
RETURN .T.
#pragma BEGINDUMP
#include <hbapi.h>
#include <windows.h>
HB_FUNC( GETNOTIFYICONDATA )
{
NOTIFYICONDATAA nid;
memset( &nid, 0, sizeof( NOTIFYICONDATA ) );
nid.cbSize = sizeof( NOTIFYICONDATA );
nid.hWnd = ( HWND ) hb_parnl( 1 );
nid.uID = ( UINT ) hb_parnl( 2 );
nid.uFlags = NIF_INFO | NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.dwInfoFlags = NIIF_INFO;
nid.uCallbackMessage = ( UINT ) hb_parnl( 3 );
nid.hIcon = ( HICON ) hb_parnl( 4 );
strcpy( nid.szTip, hb_parc( 5 ) );
strcpy( nid.szInfo, hb_parc( 5 ) );
strcpy( nid.szInfoTitle, hb_parc( 6 ) );
hb_retclen( ( char * ) &nid, sizeof( NOTIFYICONDATA ) );
}
#pragma ENDDUMP