AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Just starting out? Need help? Post your questions and find answers here.
vmars316
Enthusiast
Enthusiast
Posts: 474
Joined: Fri Jun 29, 2012 12:24 am
Contact:

AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by vmars316 »

TIA ,
I am looking for 'how to add 'Hide_program_from_Taskbar'
See Example code below :
And I am wondering how/why WindowID(0) and ImageID(0) have the same ObjectID , both zero .

Code: Select all

; Author: PWS32 (updated for PB4.00 by blbltheworm)

If OpenWindow(0, 100, 200, 195, 260, "Test Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) 

  If CreatePopupMenu(0) 
    MenuItem(1, "Restore Window") 
    MenuBar() 
    MenuItem(2, "Quit") 
    MenuBar() 
    MenuItem(3, "Help") 
  EndIf  
  
  MessageRequester("Info", "Click to Move Program to SYSTRAY", 0) 
  HideWindow(0, 1) 
  LoadImage(0, "HT.ico")
  AddSysTrayIcon (1, WindowID(0), ImageID(0)) ; <<--- Take any 16X16 icon here 
  SysTrayIconToolTip (1, "Right-click for OPTIONS") 

  Repeat 

    EventID.l = WaitWindowEvent() 

    If EventID = #PB_Event_SysTray ; <<-- PopUp when you right click on your systray icon
      If EventType() = #PB_EventType_RightClick 
        DisplayPopupMenu(0, WindowID(0)) 
      EndIf 
    EndIf 

    If EventID = #PB_Event_Menu ; <<-- PopUp Event 
      Select EventMenu() 
        Case 1 ; Restore 
           RemoveSysTrayIcon (1) 
           HideWindow(0, 0) 
           MessageRequester("Info", "Press OK and then the Minimize button on the window", 0) 
        Case 2 ; Quit 
           Quit = 1 
        Case 3 ; Help
           RunProgram("Hibernate-Help.html") 
      EndSelect 
    EndIf 
    
    If IsIconic_(WindowID(0)) ;<<-- same With the Minimize button 
      HideWindow(0, 1) 
      AddSysTrayIcon (1, WindowID(0), LoadImage(0, "HT.ico")) 
      SysTrayIconToolTip (1, "Right Mouse Button for PopUp")    
    EndIf 

    If EventID = #PB_Event_CloseWindow 
      Quit = 1 
    EndIf 

  Until Quit = 1 
  
EndIf

vmars.us Win11 x64 , Martin Guitar 000-16 (1995)
"All things in moderation , except for love and forgiveness."
infratec
Always Here
Always Here
Posts: 7577
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by infratec »

This works:

Code: Select all

EnableExplicit

; Author: PWS32 (updated for PB4.00 by blbltheworm)

Define Event.i, Quit.i


If OpenWindow(0, 100, 200, 195, 260, "Test Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) 

  If CreatePopupMenu(0) 
    MenuItem(1, "Restore Window") 
    MenuBar() 
    MenuItem(2, "Quit") 
;     MenuBar() 
;     MenuItem(3, "Help") 
  EndIf  
  
  MessageRequester("Info", "Click to Move Program to SYSTRAY") 
  HideWindow(0, #True) 
  LoadImage(0, #PB_Compiler_Home + "Examples\Sources\Data\CdPlayer.ico")
  
  Debug WindowID(0)
  Debug ImageID(0)
  
  AddSysTrayIcon(1, WindowID(0), ImageID(0)) ; <<--- Take any 16X16 icon here 
  SysTrayIconToolTip (1, "Right-click for OPTIONS") 

  Repeat 

    Event = WaitWindowEvent() 

    If Event = #PB_Event_SysTray ; <<-- PopUp when you right click on your systray icon
      If EventType() = #PB_EventType_RightClick 
        DisplayPopupMenu(0, WindowID(0)) 
      EndIf 
    EndIf 

    If Event = #PB_Event_Menu ; <<-- PopUp Event 
      Select EventMenu() 
        Case 1 ; Restore 
           RemoveSysTrayIcon(1) 
           HideWindow(0, #False)
           MessageRequester("Info", "Press OK and then the Minimize button on the window", 0)
           PostEvent(#PB_Event_MinimizeWindow)
        Case 2 ; Quit 
           Quit = #True
;         Case 3 ; Help
;            RunProgram("Hibernate-Help.html") 
      EndSelect 
    EndIf 
    
    If Event = #PB_Event_MinimizeWindow ;<<-- same With the Minimize button 
      HideWindow(0, #True)
      AddSysTrayIcon(1, WindowID(0), ImageID(0)) 
      SysTrayIconToolTip(1, "Right Mouse Button for PopUp")    
    EndIf 

    If Event = #PB_Event_CloseWindow 
      Quit = #True
    EndIf 
  
  Until Quit
  
EndIf
When do you see the 0 values?
There is no Debug in your code.

An Id can never be 0.
Or do you mean the PB numbers?
Last edited by infratec on Thu Mar 07, 2024 9:08 pm, edited 3 times in total.
User avatar
mk-soft
Always Here
Always Here
Posts: 6202
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by mk-soft »

Each object type has its own object array.
See PB help Purebasic objects.

https://www.purebasic.com/documentation ... jects.html
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
AZJIO
Addict
Addict
Posts: 2141
Joined: Sun May 14, 2017 1:48 am

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by AZJIO »

mk-soft wrote: Thu Mar 07, 2024 9:06 pm See PB help Purebasic objects.
I read and received an answer that sometimes worried me
Both methods (indexed and dynamic) can be used together at the same time without any conflict.
User avatar
Demivec
Addict
Addict
Posts: 4260
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by Demivec »

AZJIO wrote: Thu Mar 07, 2024 11:47 pm
mk-soft wrote: Thu Mar 07, 2024 9:06 pm See PB help Purebasic objects.
I read and received an answer that sometimes worried me
Both methods (indexed and dynamic) can be used together at the same time without any conflict.
Did you resolve your worries or do you still have concerns when mixing indexed and dynamic object numbering?
AZJIO
Addict
Addict
Posts: 2141
Joined: Sun May 14, 2017 1:48 am

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by AZJIO »

Demivec wrote: Fri Mar 08, 2024 12:18 am Did you resolve your worries or do you still have concerns when mixing indexed and dynamic object numbering?
Finally, I became 100% sure of this. At first I thought that this is one array through which a number is searched instead of direct access by index, because creating a large array with index access is not efficient. The numbers returned by #PB_Any are too large to create an array of that size. Now I think we have two different lists, so they can't overlap.
User avatar
mk-soft
Always Here
Always Here
Posts: 6202
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by mk-soft »

With #PB_Any it is a memory address. #PB_Any is also somewhat slower than via array, as it has to be searched for when checking.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Fred
Administrator
Administrator
Posts: 18161
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by Fred »

mk-soft wrote: Fri Mar 08, 2024 9:07 am With #PB_Any it is a memory address. #PB_Any is also somewhat slower than via array, as it has to be searched for when checking.
To be more precise, #PB_Any is only slower if you use the Is() functions ( IsWindow(), IsImage() etc.), it's the same speed for all other operations
vmars316
Enthusiast
Enthusiast
Posts: 474
Joined: Fri Jun 29, 2012 12:24 am
Contact:

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by vmars316 »

infratech ,
Yes ,
Or do you mean the PB numbers?

in

Code: Select all

AddSysTrayIcon (1,    WindowID(0),     LoadImage(0, "Examples\Sources\Data\CdPlayer.ico")) 
Aren't these PB numbers ?

Just as the PB numbers for HideWindow and LoadImage below ?

Code: Select all

  HideWindow(0, #True) 
  LoadImage(0, #PB_Compiler_Home + "Examples\Sources\Data\CdPlayer.ico")
Thanks
vmars.us Win11 x64 , Martin Guitar 000-16 (1995)
"All things in moderation , except for love and forgiveness."
vmars316
Enthusiast
Enthusiast
Posts: 474
Joined: Fri Jun 29, 2012 12:24 am
Contact:

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by vmars316 »

Sorry ,
I'm just mixed up about what's the diff between
AddSysTrayIcon (1, WindowID(0), LoadImage(0, "Examples\Sources\Data\CdPlayer.ico"))
and HideWindow(0, #True)
LoadImage(0, #PB_Compiler_Home + "Examples\Sources\Data\CdPlayer.ico")

Are they all PB_Any objects ?
Thanks
vmars.us Win11 x64 , Martin Guitar 000-16 (1995)
"All things in moderation , except for love and forgiveness."
DarkDragon
Addict
Addict
Posts: 2344
Joined: Mon Jun 02, 2003 9:16 am
Location: Germany
Contact:

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by DarkDragon »

Initially there was no #PB_Any, back then everyone had to rely on constant numbers. However you sometimes want to dynamically create those objects inside procedures or inside loops without having to check whether the outside system uses the number already. That's when #PB_Any was introduced.

Code: Select all

OpenWindow(0, ...)
Handle = WindowID(0)
Here 0 is the number and you get the OS's native window handle by calling WindowID.

#PB_Any makes the Open/Load/Create functions return a dynamic "Number".

Code: Select all

Number = OpenWindow(#PB_Any, ...)
Handle = WindowID(Number)
The WindowID/GadgetID/... functions used to return the native OS handles. Functions which require IDs can often be used for non PB objects, too. However that's not always the case.
bye,
Daniel
User avatar
mk-soft
Always Here
Always Here
Posts: 6202
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by mk-soft »

To get the window os handle from the image, this has always worked.
However, it is not included in the documentation and is therefore unofficial.

Code: Select all

hImage = LoadImage(0, #PB_Compiler_Home + "Examples\Sources\Data\CdPlayer.ico")
Debug "Window handle of Image unofficial: " + hImage
Debug "Window handle of Image official: " + ImageID(0)
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
vmars316
Enthusiast
Enthusiast
Posts: 474
Joined: Fri Jun 29, 2012 12:24 am
Contact:

Re: AddSysTrayIcon (1, WindowID(0), ImageID(0)) ?

Post by vmars316 »

In the context of your PureBasic code, when you use `0` as an argument for `OpenWindow`, `CreatePopupMenu`, `LoadImage`, and similarly for other functions, it specifies the identifier (ID) for the window, popup menu, or image. The use of `0` as an ID is a common practice for simplicity, especially in smaller programs or examples where there is only one object of each type, thus avoiding the need for maintaining a separate, unique identifier for each.

The reason `WindowID(0)` and `ImageID(0)` can both have the ID `0` and not conflict with each other is due to the way PureBasic manages these IDs internally. PureBasic segregates the namespaces for different types of objects, such as windows, images, and menus. This means that having a window and an image both with an ID of `0` is perfectly acceptable because these IDs are managed in separate contexts.

Here's a breakdown of how this works:

- `OpenWindow(0, ...)`: This opens a window with an ID of `0`. In the context of window management, `0` uniquely identifies this window.
- `LoadImage(0, "HT.ico")`: This loads an image with an ID of `0`. In the context of image management, `0` uniquely identifies this image.

Despite both the window and the image having an ID of `0`, there is no conflict because these IDs are used within their respective domains or namespaces (one for windows, one for images). This separation allows PureBasic to understand exactly what you're referring to when you use `WindowID(0)` or `ImageID(0)`, based on the function being called and the context in which the ID is used.

This design makes it easier to work with IDs in PureBasic, especially for simple applications where you might not need multiple windows or dozens of images, and thus, you can use simple, sequential IDs or even just `0` without worrying about conflicts
Ok , I get it now...
vmars.us Win11 x64 , Martin Guitar 000-16 (1995)
"All things in moderation , except for love and forgiveness."
Post Reply