Module SysTray (windows only)

Share your advanced PureBasic knowledge/code with the community.
User avatar
ts-soft
Always Here
Always Here
Posts: 5756
Joined: Thu Jun 24, 2004 2:44 pm
Location: Berlin - Germany

Module SysTray (windows only)

Post by ts-soft »

This module is for crash of explorer and restore SysTray!

It is nothing to do, only include this file before your code.
There is not support for #PB_Any in AddTrayIcon!

Code: Select all

DeclareModule SysTray
  Declare AddTrayIcon(ID, WindowID, ImageID)
  Declare ChangeTrayIcon(ID, ImageID)
  Declare RemoveTrayIcon(ID)
  Declare TrayIconToolTip(ID, Text.s)
EndDeclareModule

Module SysTray
  EnableExplicit
  
  Global TB_Message = RegisterWindowMessage_("TaskbarCreated")
  
  Structure _TrayIcon
    ID.i
    WindowID.i
    ImageID.i
    Text.s
  EndStructure
  
  Global NewList TrayIcon._TrayIcon()
  

  Procedure Callback(hWnd, Msg, wParam, lParam)
    If Msg = TB_Message
      With TrayIcon()
        ForEach TrayIcon()
          AddSysTrayIcon(\ID, \WindowID, \ImageID)
          SysTrayIconToolTip(\ID, \Text)
        Next
      EndWith
    EndIf
    
    ProcedureReturn #PB_ProcessPureBasicEvents
  EndProcedure
  
  SetWindowCallback(@Callback())
  
  Procedure AddTrayIcon(ID, WindowID, ImageID)
    Protected Result
    
    Result = AddSysTrayIcon(ID, WindowID, ImageID)
    
    AddElement(TrayIcon())
    TrayIcon()\ID = ID
    TrayIcon()\WindowID = WindowID
    TrayIcon()\ImageID = ImageID
    
    ProcedureReturn Result
  EndProcedure
  
  Procedure ChangeTrayIcon(ID, ImageID)
    ChangeSysTrayIcon(ID, ImageID)
    
    ForEach TrayIcon()
      If TrayIcon()\ID = ID
        TrayIcon()\ImageID = ImageID
        Break
      EndIf
    Next
    
  EndProcedure
  
  Procedure RemoveTrayIcon(ID)
    RemoveSysTrayIcon(ID)
    
    If ID = #PB_All
      ClearList(TrayIcon())
    Else
      ForEach TrayIcon()
        If TrayIcon()\ID = ID
          DeleteElement(TrayIcon())
          Break
        EndIf
      Next
    EndIf
  EndProcedure
  
  Procedure TrayIconToolTip(ID, Text.s)
    SysTrayIconToolTip(ID, Text)
    
    ForEach TrayIcon()
      If TrayIcon()\ID = ID
        TrayIcon()\Text = Text
        Break
      EndIf
    Next
  EndProcedure
  
EndModule

Macro AddSysTrayIcon(ID, WindowID, ImageID)
  SysTray::AddTrayIcon(ID, WindowID, ImageID)
EndMacro

Macro ChangeSysTrayIcon(ID, ImageID)
  SysTray::ChangeTrayIcon(ID, ImageID)
EndMacro

Macro RemoveSysTrayIcon(ID)
  SysTray::RemoveTrayIcon(ID)
EndMacro

Macro SysTrayIconToolTip(ID, Text)
  SysTray::TrayIconToolTip(ID, Text)
EndMacro


CompilerIf #PB_Compiler_IsMainFile
  EnableExplicit
  
  Define IconName$, Event
  
  If OpenWindow(0, 100, 150, 300, 100, "PureBasic - SysTray Example", #PB_Window_SystemMenu)
  
    ; .ico format is available only on Windows
    IconName$ = #PB_Compiler_Home + "examples/sources/Data/CdPlayer.ico"
    
    AddSysTrayIcon(1, WindowID(0), LoadImage(0, IconName$))
    AddSysTrayIcon(2, WindowID(0), LoadImage(1, IconName$))
    SysTrayIconToolTip(1, "Icon 1")
    SysTrayIconToolTip(2, "Icon 2")
    
    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_SysTray
        If EventType() = #PB_EventType_LeftDoubleClick
          MessageRequester("SysTray", "Left DoubleClick on SysTrayIcon "+Str(EventGadget()),0)
          
          ChangeSysTrayIcon (EventGadget(), LoadImage(0, IconName$))
          SysTrayIconToolTip(EventGadget(), "Changed !")
        EndIf
        
      EndIf
    Until Event = #PB_Event_CloseWindow
    
  EndIf
CompilerEndIf
PureBasic 5.73 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Old bugs good, new bugs bad! Updates are evil: might fix old bugs and introduce no new ones.
Image