[MAXGUI] Minimizing to system tray

BlitzMax Forums/MaxGUI Module/[MAXGUI] Minimizing to system tray

Triforce Guardian(Posted 2006) [#1]
Alright, I was wondering if maxgui can minimize programs to system tray. I seen the winapi examples, I want pure cross compatibility. Thanks!

~Jon Basniak


Dreamora(Posted 2006) [#2]
No it can't


ozak(Posted 2006) [#3]
There are stuff in the archives to do it on Windows. But I would be difficult to do cross platform. There are not tray on OS X, so there you just hide the window and keep the app running.
Can't remember on Linux tho, but it's very different functionality across platforms.


Dreamora(Posted 2006) [#4]
I think beside windows nothing has system tray at all.
Don't do the others only have task bar or their task bar like stuff? (as well as hidden running apps)


Helios(Posted 2006) [#5]
Here you go, I made this for a server program I was working on a while ago. To use it all you have to do is call the WindowToSystemTray function to add it you window and WindowFromSystemTray to remove it out.

This was made a while ago, and I haven't had time to test it so you may need to tweek it a little.

' Windows only, I probably should make this cross-compatible
?win32

' ---------------------------------------------------------------
'	Import external functions
' ---------------------------------------------------------------
Extern "Win32"
	Function Shell_NotifyIcon:Int(iMessage:Int,pbNotifyicondata:Byte Ptr) = "Shell_NotifyIconA@8"
	Function Shell_LoadImage:Int(iInstance:Int,strName$z,iType:Int,iDesiredX:Int,iDesiredY:Int,iLoad:Int) = "LoadImageA@24"
End Extern

' ---------------------------------------------------------------
'  Type:		tSystemTrayWindow
'  Description:	Holds details on a system tray minimized window
' ---------------------------------------------------------------
Type tSystemTrayWindow

	' ------------------------------------------------
	'  Junk to keep track of
	' ------------------------------------------------	
	Field f_hNID:tNotifyIconData
	Field f_hPanel:TGadget
	Field f_hWindow:TGadget
	
	' ------------------------------------------------
	'  Method: 		DoubleClicked
	'  Description: Returns true if double clicked
	' ------------------------------------------------	
	Method DoubleClicked:Int()
		Return (EventSource()=f_hPanel And EventX()=WM_LBUTTONDBLCLK)
	End Method

	' ------------------------------------------------
	'  Function:	Create
	'  Description: Creates a new instance of tSystemTrayWindow
	'				and returns it
	' ------------------------------------------------	
	Function create:tSystemTrayWindow()
		Return (New tSystemTrayWindow)
	End Function

End Type

' ---------------------------------------------------------------
'  Type:		tNotifyIconData
'  Description:	Used to pass data to the windows os about a 
'				system tray icon
' ---------------------------------------------------------------
Type tNotifyIconData

	' ------------------------------------------------
	'  Neccessary fields
	' ------------------------------------------------	
	Field f_iSize:Int
	Field f_iHWND:Int
	Field f_iID:Int
	Field f_iFlags:Int
	Field f_iCallbackMessage:Int
	Field f_iIcon:Int 				' HICON	
	Field f_lTip:Long				' array [0..63] of AnsiChar;
	Field f_lTip2:Long
	Field f_lTip3:Long
	Field f_lTip4:Long
	Field f_lTip5:Long
	Field f_lTip6:Long
	Field f_lTip7:Long
	Field f_lTip8:Long

	' ------------------------------------------------
	'  Function:	Create
	'  Description: Creates a new instance of tNotifyIconData
	'				and returns it
	' ------------------------------------------------	
	Function create:tNotifyIconData()
		Return (New tNotifyIconData)
	End Function
		
EndType

' ---------------------------------------------------------------
'  Type:		tSystemTrayManager
'  Description:	Responsible minimizing windows to the system tray
'				This is set as abstract to stop anyone creating
'				an instance of it. Everything in this should be 
'				global.
' ---------------------------------------------------------------
Type tSystemTrayManager Abstract

	' ------------------------------------------------
	'  System tray icon constants
	' ------------------------------------------------	
	Const c_iNIM_ADD:Int				= 0
	Const c_iNIM_MODIFY:Int				= 1
	Const c_iNIM_DELETE:Int				= 2
	Const c_iNIM_SETFOCUS:Int			= 3
	Const c_iNIM_SETVERSION:Int			= 4
	
	Const c_iNIF_MESSAGE:Int 			= $00000001
	Const c_iNIF_ICON:Int 				= $00000002
	Const c_iNIF_TIP:Int 				= $00000004
	Const c_iNIF_STATE:Int				= $00000008
	Const c_iNIF_INFO:Int 				= $00000010
	Const c_iNIF_GUID:Int 				= $00000020
		
	Const c_iIMAGE_BITMAP:Int      		= 0
	Const c_iIMAGE_ICON:Int        		= 1
	Const c_iIMAGE_CURSOR:Int      		= 2
	Const c_iIMAGE_ENHMETAFILE:Int 		= 3
	
	Const c_iLR_DEFAULTSIZE:Int     	= 64
	Const c_iLR_DEFAULTCOLOR:Int    	= 0
	Const c_iLR_MONOCHROME:Int       	= 1
	Const c_iLR_COLOR:Int            	= 2
	Const c_iLR_COPYRETURNORG:Int    	= 4
	Const c_iLR_COPYDELETEORG:Int    	= 8
	Const c_iLR_LOADFROMFILE:Int     	= 16
	Const c_iLR_LOADTRANSPARENT:Int  	= 32
	Const c_iLR_LOADREALSIZE:Int     	= 128
	Const c_iLR_LOADMAP3DCOLORS:Int  	= 4096
	Const c_iLR_CREATEDIBSECTION:Int 	= 8192
	Const c_iLR_COPYFROMRESOURCE:Int 	= $4000 
	Const c_iLR_SHARED:Int      	  	= 32768

	' ------------------------------------------------
	'  Function: 	m_LoadIcon
	'  Description:	Loads a gdi icon using the win api
	'				and returns it
	' ------------------------------------------------			
	Function m_LoadIcon:Int(strFilename:String,iWidth:Int=16,iHeight:Int=16,iFlags:Int=c_iLR_SHARED)
		Return Shell_LoadImage(0,strFilename,c_iIMAGE_ICON,iWidth,iHeight,c_iLR_LOADFROMFILE|iFlags)
	End Function

	' ------------------------------------------------
	'  Function: 	m_SetNotifyIconDataTip
	'  Description:	Sets the tooltip of the system 
	'				tray icon
	' ------------------------------------------------
	Function m_SetNotifyIconDataTip(hNid:tNotifyIconData, strTip:String)
		MemClear(Varptr hNid.f_lTip, 64)
		If strTip.Length > 0 Then
			Local p:Byte Ptr = strTip.ToCString()
			If strTip.Length < 64 Then
				MemCopy( Varptr hNid.f_lTip, p, strTip.Length)
			Else			
				MemCopy( Varptr hNid.f_lTip, p, 63)			
			EndIf
			MemFree(p)
		EndIf
	End Function
	
	' ------------------------------------------------
	'  Function: 	WindowToSystemTray
	'  Description: Minimizes a window to the 
	'				system tray
	' ------------------------------------------------
	Function WindowToSystemTray:tSystemTrayWindow(hWindow:tGadget,strIconFile:String="",strTooltip:String="")
		
		' Hide window
		HideGadget(hWindow)
		
		' Create system tray window
		Local hWin:tSystemTrayWindow = tSystemTrayWindow.Create()
		hWin.f_hWindow = hWindow
		hWin.f_hPanel  = CreatePanel(0,0,0,0,hWindow,PANEL_ACTIVE)
		
		' Create icon details
		hWin.f_hNID = tNotifyIconData.Create()
		hWin.f_hNID.f_iSize = SizeOf(tNotifyIconData)
		hWin.f_hNID.f_iHWND = QueryGadget(hWin.f_hPanel,QUERY_HWND)
		hWin.f_hNID.f_iID = 0
		hWin.f_hNID.f_iCallbackMessage = WM_MOUSEMOVE
		If FileType(strIconFile) = 1 Then hWin.f_hNID.f_iIcon = m_LoadIcon(strIconFile) 
		hWin.f_hNID.f_iFlags = c_iNIF_MESSAGE|c_iNIF_TIP|c_iNIF_ICON
		
		' Set tooltip and minimze to tray
		m_SetNotifyIconDataTip(hWin.f_hNID,strTooltip)
		Shell_NotifyIcon(c_iNIM_ADD,hWin.f_hNID)
		
		' Return window
		Return hWin
		
	End Function
	
	' ------------------------------------------------
	'  Function: 	WindowFromSystemTray
	'  Description: Maximizes a window from the 
	'				system tray
	' ------------------------------------------------
	Function WindowFromSystemTray(hWin:tSystemTrayWindow)
		
		' Show window
		ShowGadget(hWin.f_hWindow)
		
		' Free panel
		FreeGadget(hWin.f_hPanel)
		
		' Delete icon
		Shell_NotifyIcon(c_iNIM_DELETE,hWin.f_hNID)
		
	End Function
		
End Type
?



Grisu(Posted 2008) [#6]
^ Does this code work with the lastest version of BMX / MaxGuiEx?

Keep getting an error: Identifier "WindowToSystemTray" not found... :(