Diana (Cda) Posted December 10, 2008 Posted December 10, 2008 There are so many scripts for minimizing a GUI to the tray but they're all rather long. I thought it would be simpler to just do something along of calling something like _Minimize2Tray() from a UDF. Has anyone ever used that approach? I searched for a UDF but no-one has posted anything like that; however, it's often the case that the search function doesn't bring up everything. So I thought I'd ask instead of assuming that there isn't anything like this just because I can't find it. Thanks. <g>
Andreik Posted December 10, 2008 Posted December 10, 2008 There are so many scripts for minimizing a GUI to the tray but they're all rather long. I thought it would be simpler to just do something along of calling something like _Minimize2Tray() from a UDF. Has anyone ever used that approach? I searched for a UDF but no-one has posted anything like that; however, it's often the case that the search function doesn't bring up everything. So I thought I'd ask instead of assuming that there isn't anything like this just because I can't find it.Thanks. <g>This is a short and good example.
Moderators SmOke_N Posted December 10, 2008 Moderators Posted December 10, 2008 (edited) Here's a fun way I thought to do it: expandcollapse popupOpt("GUIEventOptions", 1) Global $h_gui = GuiCreate("Minimize Test") GUISetState() Global $a_last_pos = 0 While 1 Switch GUIGetMsg() Case -3 Exit Case $GUI_EVENT_MINIMIZE $a_last_pos = _Win_Minimize_ToTray($h_gui) Sleep(3000) _Win_Restore_FromTray($h_gui, $a_last_pos) EndSwitch WEnd Func _Win_Restore_FromTray($h_wnd, $a_position = -1) If IsArray($a_position) Then DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $h_wnd, "dword", 100, "dword", BitOR(0x002, 0x0040000, 0x008)) WinMove($h_wnd, "", $a_position[0], $a_position[1], $a_position[2], $a_position[3]) Return EndIf WinSetState($h_wnd, "", @SW_SHOW) WinSetState($h_wnd, "", @SW_RESTORE) Return EndFunc Func _Win_Minimize_ToTray($h_wnd) Local Const $AW_SLIDE = 0x0040000 Local Const $AW_ACTIVATE = 0x0020000 Local Const $AW_BLEND = 0x0080000 Local Const $AW_HIDE = 0x0010000 Local Const $AW_CENTER = 0x0010 Local Const $AW_HOR_POSITIVE = 0x001 Local Const $AW_HOR_NEGATIVE = 0x002 Local Const $AW_VER_POSITIVE = 0x004 Local Const $AW_VER_NEGATIVE = 0x008 If Opt("GUIEventOptions") Then Local $a_wpos = WinGetPos($h_wnd) If Not @error Then Local $a_cpos = ControlGetPos("[CLASS:Shell_TrayWnd]", "", "ReBarWindow321") If Not @error Then Local $i_x = (@DesktopWidth - $a_wpos[2]) Local $i_y = @DesktopHeight - ($a_wpos[3] + $a_cpos[3]) WinMove($h_wnd, "", $i_x, $i_y) DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $h_wnd, "dword", 100, "dword", BitOR($AW_HIDE, $AW_SLIDE, $AW_HOR_POSITIVE, $AW_VER_POSITIVE)) WinSetState($h_wnd, "", @SW_HIDE) Return $a_wpos EndIf EndIf EndIf While Not BitAND(WinGetState($h_wnd), 16) Sleep(10) WEnd WinSetState($h_wnd, "", @SW_HIDE) Return EndFuncNow you'd have to plugin the Tray stuff, I only showed examples of how to use it. To see both effects, comment and uncomment Opt("GUIEventOptions", 1). Edited December 10, 2008 by SmOke_N Changed restore Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
Andreik Posted December 10, 2008 Posted December 10, 2008 Nice example SmOke_N. She just need to add GUIConstantsEx.au3 if isn't included in script before.
Moderators SmOke_N Posted December 10, 2008 Moderators Posted December 10, 2008 (edited) Nice example SmOke_N. She just need to add GUIConstantsEx.au3 if isn't included in script before.Well there seems to be an issue I didn't notice before... It isn't hiding the window once I use $AW_HIDE .. kind of ruins the effect not using it though... I tried changing the windows long ex style value to: $WS_EX_TOOLWINDOW ... but that's not working either.CODE#include <GUIConstantsEx.au3> Opt("GUIEventOptions", 1) Global $h_gui = GuiCreate("Minimize Test") GUISetState() Global $a_last_pos = 0 While 1 Switch GUIGetMsg() Case -3 Exit Case $GUI_EVENT_MINIMIZE $a_last_pos = _Win_Minimize_ToTray($h_gui) Sleep(3000) _Win_Restore_FromTray($h_gui, $a_last_pos) EndSwitch WEnd Func _Win_Restore_FromTray($h_wnd, $a_position = -1) If IsArray($a_position) Then If $a_position[4] Then DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $h_wnd, "int", -20, "long", $a_position[4]) EndIf DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $h_wnd, "dword", 100, "dword", BitOR(0x002, 0x0040000, 0x008)) WinMove($h_wnd, "", $a_position[0], $a_position[1], $a_position[2], $a_position[3]) Return EndIf WinSetState($h_wnd, "", @SW_SHOW) WinSetState($h_wnd, "", @SW_RESTORE) Return EndFunc Func _Win_Minimize_ToTray($h_wnd) Local Const $AW_SLIDE = 0x0040000 Local Const $AW_ACTIVATE = 0x0020000 Local Const $AW_BLEND = 0x0080000 Local Const $AW_HIDE = 0x0010000 Local Const $AW_CENTER = 0x0010 Local Const $AW_HOR_POSITIVE = 0x001 Local Const $AW_HOR_NEGATIVE = 0x002 Local Const $AW_VER_POSITIVE = 0x004 Local Const $AW_VER_NEGATIVE = 0x008 If Opt("GUIEventOptions") Then Local $a_wpos = WinGetPos($h_wnd) If Not @error Then Local $a_ret[5] = [$a_wpos[0], $a_wpos[1], $a_wpos[2], $a_wpos[3], 0] Local $a_cpos = ControlGetPos("[CLASS:Shell_TrayWnd]", "", "ReBarWindow321") If Not @error Then Local $i_x = (@DesktopWidth - $a_wpos[2]) Local $i_y = @DesktopHeight - ($a_wpos[3] + $a_cpos[3]) WinMove($h_wnd, "", $i_x, $i_y) Local $a_winlong = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $h_wnd, "int", -20) If Not BitAND($a_winlong[0], 0x00000080) Then DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $h_wnd, "int", -20, "long", 0x00000080) $a_ret[4] = $a_winlong[0] EndIf DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $h_wnd, "dword", 100, "dword", BitOR($AW_HIDE, $AW_SLIDE, $AW_HOR_POSITIVE, $AW_VER_POSITIVE)) Return $a_ret EndIf EndIf EndIf While Not BitAND(WinGetState($h_wnd), 16) Sleep(10) WEnd WinSetState($h_wnd, "", @SW_HIDE) Return EndFunc I have not more time to play with it... maybe someone can enhance it (or actually make that part work lol ... ) On GUIConstantsEx... Yeah, I usually use just the constant values so I forget to include the includes. Edit: Here's a temp fix until then:CODE#include <GUIConstantsEx.au3> Opt("GUIEventOptions", 1) Global $h_gui = GuiCreate("Minimize Test") GUISetState()     Global $a_last_pos = 0 While 1     Switch GUIGetMsg()         Case -3             Exit         Case $GUI_EVENT_MINIMIZE             $a_last_pos = _Win_Minimize_ToTray($h_gui)             Sleep(3000)             _Win_Restore_FromTray($h_gui, $a_last_pos)     EndSwitch WEnd Func _Win_Restore_FromTray($h_wnd, $a_position = -1)     If IsArray($a_position) Then ;~         WinMove($h_wnd, "", $a_position[4], $a_position[5]) ;~         WinSetState($h_wnd, "", @SW_SHOW) ;~        DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $h_wnd, "dword", 20, "dword", BitOR(0x002, 0x0040000, 0x008))         WinMove($h_wnd, "", $a_position[0], $a_position[1], $a_position[2], $a_position[3])         Return     EndIf     WinSetState($h_wnd, "", @SW_SHOW)     WinSetState($h_wnd, "", @SW_RESTORE)     Return EndFunc Func _Win_Minimize_ToTray($h_wnd)     Local Const $AW_SLIDE        =  0x0040000     Local Const $AW_ACTIVATE      =  0x0020000     Local Const $AW_BLEND        =  0x0080000     Local Const $AW_HIDE          =  0x0010000     Local Const $AW_CENTER        =  0x0010     Local Const $AW_HOR_POSITIVE  =  0x001     Local Const $AW_HOR_NEGATIVE  =  0x002     Local Const $AW_VER_POSITIVE  =  0x004     Local Const $AW_VER_NEGATIVE  =  0x008         If Opt("GUIEventOptions") Then         Local $a_wpos = WinGetPos($h_wnd)         If Not @error Then             Local $a_cpos = ControlGetPos("[CLASS:Shell_TrayWnd]", "", "ReBarWindow321")             If Not @error Then                                 Local $i_x = (@DesktopWidth - $a_wpos[2])                 Local $i_y = @DesktopHeight - ($a_wpos[3] + $a_cpos[3])                 Local $a_ret[6] = [$a_wpos[0], $a_wpos[1], $a_wpos[2], $a_wpos[3], $i_x, $i_y]                                 WinMove($h_wnd, "", $i_x, $i_y)                                 DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $h_wnd, "dword", 100, "dword", BitOR($AW_HIDE, $AW_SLIDE, $AW_HOR_POSITIVE, $AW_VER_POSITIVE))                             ; Move out of view and animate window again so we can hide now and restore properly later                 WinMove($h_wnd, "", -32000, -32000)                 DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $h_wnd, "dword", 0, "dword", BitOR($AW_SLIDE, $AW_VER_POSITIVE))                                 WinSetState($h_wnd, "", @SW_HIDE)                 Return $a_ret             EndIf         EndIf     EndIf         While Not BitAND(WinGetState($h_wnd), 16)         Sleep(10)     WEnd         WinSetState($h_wnd, "", @SW_HIDE)     Return EndFunc Edited December 10, 2008 by SmOke_N Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer.
wraithdu Posted December 10, 2008 Posted December 10, 2008 (edited) My solution. This one is good because it doesn't hide the window. FYI, hidden windows don't receive GUIOnEventMode() messages. So a hidden window wouldn't respond to hotkeys or tray event in OnEventMode. expandcollapse popup#include <GuiConstantsEx.au3> #include <GuiToolbar.au3> #include <Constants.au3> Opt("TrayMenuMode", 1) $gui = GUICreate("Minimize to tray example.") GUISetState() Do $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_MINIMIZE _ToolbarButtonState($gui, 0) EndSwitch $tmsg = TrayGetMsg() Switch $tmsg Case $TRAY_EVENT_PRIMARYDOWN If BitAND(WinGetState($gui), 16) Then ; 16 = minimized GUISetState(@SW_RESTORE) _ToolbarButtonState($gui, 1) EndIf EndSwitch Until $msg == -3 Func _ToolbarButtonState($hwnd, $state) Local $wndname = WinGetTitle($hwnd) Local $toolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow324") ; ToolbarWindow322 on WinXP Local $count = _GUICtrlToolbar_ButtonCount($toolbar) For $i = 0 To $count - 1 Local $cID = _GUICtrlToolbar_IndexToCommand($toolbar, $i) If $wndname = _GUICtrlToolbar_GetButtonText($toolbar, $cID) Then Switch $state Case 0 _GUICtrlToolbar_HideButton($toolbar, $cID) Case 1 _GUICtrlToolbar_HideButton($toolbar, $cID, False) EndSwitch EndIf Next EndFunc Edited December 10, 2008 by wraithdu
rasim Posted December 11, 2008 Posted December 11, 2008 wraithduHi! Sorry, but I don't understand, why need the _ToolbarButtonState function? Anyway this function doesn't work . Simple example:#NoTrayIcon #include <GuiConstantsEx.au3> #include <GuiToolbar.au3> #include <Constants.au3> Opt("TrayMenuMode", 1) $gui = GUICreate("Minimize to tray example.") GUISetState() Do $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_MINIMIZE TraySetState(1) EndSwitch $tmsg = TrayGetMsg() Switch $tmsg Case $TRAY_EVENT_PRIMARYDOWN If BitAND(WinGetState($gui), 16) Then ; 16 = minimized GUISetState(@SW_RESTORE) TraySetState(2) EndIf EndSwitch Until $msg = -3
wraithdu Posted December 11, 2008 Posted December 11, 2008 (edited) My function hides the Toolbar Button as well. You have to change this line to ToolbarWindow322 as noted for Windows XP (it's ToolbarWindow324 in Vista) - Local $toolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322") Hides this button - Edited December 11, 2008 by wraithdu
rasim Posted December 11, 2008 Posted December 11, 2008 My function hides the Toolbar Button as well. You have to change this line to ToolbarWindow322 as noted for Windows XP (it's ToolbarWindow324 in Vista) - Local $toolbar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "ToolbarWindow322") Hides this button -OK! Understand.
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