Jump to content

(solved)First time trying to create custom tray icon menus


Recommended Posts

Like stated above, I have never really attempted to create tray icon menus simply due to the fact I find them annoying (if I want to minimize a program, I will click "minimize", but if I want to close it, I don't want it to minimize to task bar and require me to close it there), but thought I should try incorporating them into latest script to at least say that I can use them.  However, I am running into a couple of snags/facts I would like to verify.  1) Since tray icons come with their own "GetMsg" function, I just want to verify that, while the continual paging of the tray menu item would still occur within some kind of loop, can the tray menu item events be declared outside and separate from the GUI events?  eg.

While 1
    $tmsg = TrayGetMsg ()
    $nMsg = GUIGetMsg(1)
    Switch $tmsg
        Case $TrayMenu
        Case $settings1
            If TrayItemGetState ( $settings1 ) = 65 Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", "$TRAY_CHECKED" )
            ElseIf TrayItemGetState ( $settings1 ) = 68 Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", "$TRAY_UNCHECKED" )
            Else
            EndIf

        Case $settings2

            If TrayItemGetState ( $settings2 ) = 65 Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", "$TRAY_CHECKED" )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), $WS_EX_TOPMOST, $Form1_1 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $DS_SETFOREGROUND), $WS_EX_TOPMOST, $Form2 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $Form3_1 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form4 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form5 )
            ElseIf TrayItemGetState ( $settings2 ) = 68 Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", "$TRAY_UNCHECKED" )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), 0, $Form1_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form2 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE), $Form3_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form4 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form5 )
            Else
            EndIf

    EndSwitch

    Switch $nMsg[1]
        Case $Form1_1
            Switch $nMsg[0]
                Case $GUI_EVENT_CLOSE
                    ;ProcessClose ( "pastebutt.exe" )
                    ;ProcessClose ( "PasteButtonhk.exe" )
                    Exit
                EndSwitch
          EndSwitch
     Wend

My second question also involves the above code, but specifically the "Ini" functions which attempt to read a "tray" state flag from an Ini file.  The following is code located at very beginning of script:

Const $path = @AppDataDir & "\filler"
Opt ( "TrayMenuMode", 1 )
OnAutoItExitRegister ( "refresh" )
$nonote = False
$TrayMenu = TrayCreateMenu ( "Settings" )
$settings1 = TrayCreateItem ( "Turn off notifications", $TrayMenu )
TrayItemSetState ( -1, IniRead ( $path & "\infostore.ini", "Tray Settings", "No Notifications", "$TRAY_UNCHECKED" ) )
$settings2 = TrayCreateItem ( "Keep Window on top", $TrayMenu )
TrayItemSetState ( -1, IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", "$TRAY_UNCHECKED" ) )

So the idea is that whenever the user "checks" one of the tray icon menu options, its current "state" will be input into the "ini" file, so that the state of the particular tray menu item will be in the same state as the user left it when the script is launched next.  However, this is not occurring: the ini file contains the "state" flag like it should, but the tray menu item remains unchecked at startup.  Furthermore, the checking or unchecking of "setting1" is not being recognized, as the windows' extended styles do not obtain the "Topmost" flag like they should had it worked.  I get the feeling I'm not getting the "states" of the tray menu items correct.  Any advice?

ini.png

Edited by MattHiggs
Link to comment
Share on other sites

  1. It should be only one loop but 2 switch...endswitch regions in this loop are ok.
  2. the value for OnTop isn't correct. OnTop=4  is correct. You used the IniWrite false, it must be:
    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED) )

    or:

    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", 4) )

    Also the IniRead should be:

    TrayItemSetState ( -1, Int(IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED ) ))

     

 

Link to comment
Share on other sites

OHH.  Ok.  I was under the impression that the only values that any of the INI functions would accept where strings and would at a later point need to be converted to whatever the final variable it should be.  I will give it a shot.

Link to comment
Share on other sites

4 hours ago, AutoBert said:
  1. It should be only one loop but 2 switch...endswitch regions in this loop are ok.
  2. the value for OnTop isn't correct. OnTop=4  is correct. You used the IniWrite false, it must be:
    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED) )

    or:

    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", 4) )

    Also the IniRead should be:

    TrayItemSetState ( -1, Int(IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED ) ))

     

Yeah.  So this didn't work.  I altered the code as instructed:

Const $path = @AppDataDir & "\filler"
Opt ( "TrayMenuMode", 1 )
OnAutoItExitRegister ( "refresh" )
$nonote = False
$TrayMenu = TrayCreateMenu ( "Settings" )
$settings1 = TrayCreateItem ( "Turn off notifications", $TrayMenu )
TrayItemSetState ( -1, Int ( IniRead ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_UNCHECKED ) ) )
$settings2 = TrayCreateItem ( "Keep Window on top", $TrayMenu )
TrayItemSetState ( -1, Int (IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED ) ))

and

While 1
    $tmsg = TrayGetMsg ()
    $nMsg = GUIGetMsg(1)
    Switch $tmsg
        Case $TrayMenu
        Case $settings1
            If TrayItemGetState ( $settings1 ) = $TRAY_CHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_CHECKED )
            ElseIf TrayItemGetState ( $settings1 ) = $TRAY_UNCHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_UNCHECKED )
            Else
            EndIf

        Case $settings2

            If TrayItemGetState ( $settings2 ) = $TRAY_CHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_CHECKED )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), $WS_EX_TOPMOST, $Form1_1 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $DS_SETFOREGROUND), $WS_EX_TOPMOST, $Form2 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $Form3_1 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form4 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form5 )
            ElseIf TrayItemGetState ( $settings2 ) = $TRAY_UNCHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), 0, $Form1_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form2 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE), $Form3_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form4 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form5 )
            Else
            EndIf

    EndSwitch

    Switch $nMsg[1]
        Case $Form1_1
            Switch $nMsg[0]
            EndSwitch
            EndSwitch
            Wend

 

The only difference is that now there is no data being saved to the INI file (attached).  Ini Files can only accept strings as forms of input and can only return strings, like I stated above, so I am going to change it back.  Anybody else have any suggestions?

ini.png

Link to comment
Share on other sites

4 hours ago, AutoBert said:
  1. It should be only one loop but 2 switch...endswitch regions in this loop are ok.
  2. the value for OnTop isn't correct. OnTop=4  is correct. You used the IniWrite false, it must be:
    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED) )

    or:

    IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", 4) )

    Also the IniRead should be:

    TrayItemSetState ( -1, Int(IniRead ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED ) ))

     

As for where I got the 65 and 68 for the GetState values, I had a message box setup up to give the state of the tray menu item whenever TrayGetMsg received the handle, and it kept including the "enabled" (64) flag as well, which is why I tried that.

 

Link to comment
Share on other sites

 

13 minutes ago, MattHiggs said:
4 hours ago, AutoBert said:

...

As for where I got the 65 and 68 for the GetState values, I had a message box setup up to give the state of the tray menu item whenever TrayGetMsg received the handle, and it kept including the "enabled" (64) flag as well, which is why I tried that.

I never said this, but StateValue 65=

  • $TRAY_CHECKED 1 Menuitem will be checked
  • + $TRAY_ENABLE 64 Menuitem will be enabled
if BitAND(TrayItemGetState,$settings1,$TRAY_CHECKED)=$TRAY_CHECKED Then IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_CHECKED )

writes No Notifications=1 in INI.

Edited by AutoBert
Link to comment
Share on other sites

4 minutes ago, AutoBert said:

 

I never said this, but StateValue 65=

  • $TRAY_CHECKED 1 Menuitem will be checked
  • + $TRAY_ENABLE 64 Menuitem will be enabled

 

My bad.  I wrote that.  I don't even know how that happened.  But that is the process I took to try and find out the correct "state" of the tray menu item in order for the functions to start occurring.  I have tried both pairs (1 and 4) and (65 and 68) but neither seem to work.

Link to comment
Share on other sites

The code looks the exact same with one small addition:

While 1
    $tmsg = TrayGetMsg ()
    $nMsg = GUIGetMsg(1)
    Switch $tmsg
        Case $TrayMenu
        Case $settings1
            #Region --- CodeWizard generated code Start ---

;MsgBox features: Title=Yes, Text=Yes, Buttons=OK, Icon=None
MsgBox($MB_OK,"State",TrayItemGetState ($settings1))
#EndRegion --- CodeWizard generated code End ---

            If TrayItemGetState ( $settings1 ) = $TRAY_CHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_CHECKED )
            ElseIf TrayItemGetState ( $settings1 ) = $TRAY_UNCHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_UNCHECKED )
            Else
            EndIf

        Case $settings2

            If TrayItemGetState ( $settings2 ) = $TRAY_CHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_CHECKED )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), $WS_EX_TOPMOST, $Form1_1 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $DS_SETFOREGROUND), $WS_EX_TOPMOST, $Form2 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE, $WS_EX_TOPMOST), $Form3_1 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form4 )
                GUISetStyle ( -1, $WS_EX_TOPMOST, $Form5 )
            ElseIf TrayItemGetState ( $settings2 ) = $TRAY_UNCHECKED Then
                IniWrite ( $path & "\infostore.ini", "Tray Settings", "On top", $TRAY_UNCHECKED )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), 0, $Form1_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form2 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form3 )
                GUISetStyle ( BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP), BitOR($WS_EX_OVERLAPPEDWINDOW, $WS_EX_WINDOWEDGE), $Form3_1 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form4 )
                GUISetStyle ( $GUI_SS_DEFAULT_GUI, 0, $Form5 )
            Else
            EndIf

    EndSwitch

When the msg box pops up with the state of the tray menu item, it always has the "enabled" flag added in

Link to comment
Share on other sites

Last try: this is not a chat, so edit your posts instead of creating a new one every 5 minutes.

Edit1: Here's a older project, just updated to restore the TrayItemsettings: numpad.au3

Restore is done in #78 to 84, save settings is done in 98,99,103,104.

So you see it's possible to store other variables then strings in INI-files, but you must convert it back.

 

Edit2: the tool simulates a numeric pad on keyboard, so use ^o to turn this feature off.

Edited by AutoBert
Link to comment
Share on other sites

43 minutes ago, AutoBert said:

 

I never said this, but StateValue 65=

  • $TRAY_CHECKED 1 Menuitem will be checked
  • + $TRAY_ENABLE 64 Menuitem will be enabled
if BitAND(TrayItemGetState,$settings1,$TRAY_CHECKED)=$TRAY_CHECKED Then IniWrite ( $path & "\infostore.ini", "Tray Settings", "No Notifications", $TRAY_CHECKED )

writes No Notifications=1 in INI.

This worked.  Thank you.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...