MattHiggs Posted March 9, 2016 Posted March 9, 2016 (edited) 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. expandcollapse popupWhile 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? Edited March 9, 2016 by MattHiggs
AutoBert Posted March 9, 2016 Posted March 9, 2016 It should be only one loop but 2 switch...endswitch regions in this loop are ok. 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 ) ))
MattHiggs Posted March 9, 2016 Author Posted March 9, 2016 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.
MattHiggs Posted March 9, 2016 Author Posted March 9, 2016 4 hours ago, AutoBert said: It should be only one loop but 2 switch...endswitch regions in this loop are ok. 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 expandcollapse popupWhile 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?
MattHiggs Posted March 9, 2016 Author Posted March 9, 2016 4 hours ago, AutoBert said: It should be only one loop but 2 switch...endswitch regions in this loop are ok. 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.
AutoBert Posted March 9, 2016 Posted March 9, 2016 (edited) 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 March 9, 2016 by AutoBert
MattHiggs Posted March 9, 2016 Author Posted March 9, 2016 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.
MattHiggs Posted March 9, 2016 Author Posted March 9, 2016 The code looks the exact same with one small addition: expandcollapse popupWhile 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
MattHiggs Posted March 9, 2016 Author Posted March 9, 2016 There are other ways to go about this can accomplish the same thing. I just wanted to know if it is possible to do it this way.
AutoBert Posted March 9, 2016 Posted March 9, 2016 Is the TrayItem enabled? Yes then it's correct No, post a runable reproducer instead of snippets and next please edit your post's
MattHiggs Posted March 9, 2016 Author Posted March 9, 2016 (edited) And just to confirm, enabled simply means that it is not greyed out and "clickable" yes?? Edited March 9, 2016 by MattHiggs
AutoBert Posted March 9, 2016 Posted March 9, 2016 (edited) 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 March 9, 2016 by AutoBert
MattHiggs Posted March 9, 2016 Author Posted March 9, 2016 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now