Dampe Posted January 28, 2009 Posted January 28, 2009 Everytime I close a window, this will continue to loop the _AddWindows() Function, my head is in a spin :S expandcollapse popup#include <GUIConstants.au3> #include <WindowsConstants.au3> #include <GuiButton.au3> #include <ButtonConstants.au3> #include <StaticConstants.au3> #include <Array.au3> Local $WinBtns[1] Local $BarWinList = WinList() Local $DesktopMin = False Opt("GUIOnEventMode", 1) _Draw() While 1 Sleep(10) _CheckWindows() WEnd Func _CheckWindows() For $i = 1 To $BarWinList[0][0] If Not WinExists($BarWinList[$i][0]) Then For $i = 1 to UBound ($WinBtns) -1 Step 1 GUICtrlDelete ($WinBtns[$i]) Next $BarWinList = "" _AddWindows() ExitLoop EndIf Next EndFunc ;==>_CheckWindows Func _Draw() $GUI = GUICreate("", @DesktopWidth, 30, 0, @DesktopHeight - 30, BitOR($WS_POPUP, $WS_BORDER)) ;//Background GUISetBkColor(0xBB6655) ;//Time $GUILblTime = GUICtrlCreateLabel(@MDAY & "/" & @MON & "/" & @YEAR & " - " & @HOUR & ":" & @MIN, @DesktopWidth - 110, 8, 160, 15) GUICtrlSetColor(-1, 0xFFFFFF) ;GUICtrlSetFont (-1, -1, 800) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) $GUIBtnDesktop = GUICtrlCreateButton("", 7, 4, 22, 22, BitOR($BS_ICON, $BS_FLAT)) GUICtrlSetImage(-1, "shell32.dll", 35, 0) _AddWindows() GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUICtrlSetOnEvent($GUIBtnDesktop, "_GoToDesktop") GUISetState(@SW_SHOW) WinSetOnTop($GUI, "", 1) EndFunc ;==>_Draw Func _GoToDesktop() If $DesktopMin = True Then WinMinimizeAllUndo() $DesktopMin = False Else WinMinimizeAll() $DesktopMin = True EndIf EndFunc ;==>_GoToDesktop Func _Exit() Exit 0 EndFunc ;==>_Exit Func _WinClick() WinActivate(_GUICtrlButton_GetText(@GUI_CtrlId)) EndFunc ;==>_WinClick Func _AddWindows() $var = WinList() $Tcount = 1 $BarWinList = "" For $i = 1 To $var[0][0] If $var[$i][0] <> "" And IsVisible($var[$i][1]) Then ;$var[$i][0] ReDim $WinBtns[UBound($WinBtns) + 1] $tText = StringLeft($var[$i][0], 20) $WinBtns[$Tcount] = GUICtrlCreateButton($tText, ($Tcount * 155) - 120, 2, 150, 25, $BS_FLAT) GUICtrlSetBkColor(-1, 0xFFDDAA) GUICtrlSetOnEvent($WinBtns[$Tcount], "_WinClick") $Tcount += 1 EndIf Next $BarWinList = "" $BarWinList = WinList() ; EndFunc ;==>_AddWindows Func IsVisible($handle) If BitAND(WinGetState($handle), 2) Then Return 1 Else Return 0 EndIf EndFunc ;==>IsVisible
jvanegmond Posted January 28, 2009 Posted January 28, 2009 It might have something to do with the fact you're using $i for two things at the same time.Func _CheckWindows() For $i = 1 To $BarWinList[0][0] If Not WinExists($BarWinList[$i][0]) Then For $i = 1 to UBound ($WinBtns) -1 Step 1 GUICtrlDelete ($WinBtns[$i]) Next $BarWinList = "" _AddWindows() ExitLoop EndIf Next EndFunc ;==>_CheckWindows github.com/jvanegmond
zero57 Posted January 28, 2009 Posted January 28, 2009 It might have something to do with the fact you're using $i for two things at the same time.Func _CheckWindows() For $i = 1 To $BarWinList[0][0] If Not WinExists($BarWinList[$i][0]) Then For $i = 1 to UBound ($WinBtns) -1 Step 1 GUICtrlDelete ($WinBtns[$i]) Next $BarWinList = "" _AddWindows() ExitLoop EndIf Next EndFunc ;==>_CheckWindowsI also agree with him. [font="Arial Black"][u]zero57[/u][/font]
Dampe Posted January 28, 2009 Author Posted January 28, 2009 when you say I'm using $i twice, can I resolve that issue by using for example: for $i = 1 to 50 step 1 for $x = 1 to 30 step 1 next next or should I change the loop to a do / while? I tried changing $i to $x but it's still doing the same problem.
jvanegmond Posted January 28, 2009 Posted January 28, 2009 (edited) What I found out by debugging your application, is that this happens: Checking hWnd SciTE interface Checking hWnd TF_FloatingLangBar_WndTitle Checking hWnd CiceroUIWndFrame Checking hWnd Checking hWnd Start Menu Checking hWnd Checking hWnd Checking hWnd Checking hWnd As you can see it checks the name of the application. However, a name is not a very good identifier for a window, because a name changes. To get around this problem we use the window handle (or known as hWnd) which is a unique identifier for any window. I did also change the two for loops. You shouldn't use the same name, because it gives unexpected results. Here's the fixed application using window handles, instead of names. expandcollapse popup#include <GUIConstants.au3> #include <WindowsConstants.au3> #include <GuiButton.au3> #include <ButtonConstants.au3> #include <StaticConstants.au3> #include <Array.au3> Dim $WinBtns[1] Dim $BarWinList = WinList() Dim $DesktopMin = False Opt("GUIOnEventMode", 1) _Draw() While 1 Sleep(10) _CheckWindows() WEnd Func _CheckWindows() For $i = 1 To $BarWinList[0][0] If Not WinExists($BarWinList[$i][1]) Then For $x = 1 to UBound ($WinBtns) -1 Step 1 GUICtrlDelete ($WinBtns[$x]) Next $BarWinList = "" _AddWindows() ExitLoop EndIf Next EndFunc ;==>_CheckWindows Func _Draw() $GUI = GUICreate("", @DesktopWidth, 30, 0, @DesktopHeight - 30, BitOR($WS_POPUP, $WS_BORDER)) ;//Background GUISetBkColor(0xBB6655) ;//Time $GUILblTime = GUICtrlCreateLabel(@MDAY & "/" & @MON & "/" & @YEAR & " - " & @HOUR & ":" & @MIN, @DesktopWidth - 110, 8, 160, 15) GUICtrlSetColor(-1, 0xFFFFFF) ;GUICtrlSetFont (-1, -1, 800) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) $GUIBtnDesktop = GUICtrlCreateButton("", 7, 4, 22, 22, BitOR($BS_ICON, $BS_FLAT)) GUICtrlSetImage(-1, "shell32.dll", 35, 0) _AddWindows() GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUICtrlSetOnEvent($GUIBtnDesktop, "_GoToDesktop") GUISetState(@SW_SHOW) WinSetOnTop($GUI, "", 1) EndFunc ;==>_Draw Func _GoToDesktop() If $DesktopMin = True Then WinMinimizeAllUndo() $DesktopMin = False Else WinMinimizeAll() $DesktopMin = True EndIf EndFunc ;==>_GoToDesktop Func _Exit() Exit 0 EndFunc ;==>_Exit Func _WinClick() WinActivate(_GUICtrlButton_GetText(@GUI_CtrlId)) EndFunc ;==>_WinClick Func _AddWindows() $var = WinList() $Tcount = 1 $BarWinList = "" For $i = 1 To $var[0][0] If $var[$i][0] <> "" And IsVisible($var[$i][1]) Then ;$var[$i][0] ReDim $WinBtns[UBound($WinBtns) + 1] $tText = StringLeft($var[$i][0], 20) $WinBtns[$Tcount] = GUICtrlCreateButton($tText, ($Tcount * 155) - 120, 2, 150, 25, $BS_FLAT) GUICtrlSetBkColor(-1, 0xFFDDAA) GUICtrlSetOnEvent($WinBtns[$Tcount], "_WinClick") $Tcount += 1 EndIf Next $BarWinList = "" $BarWinList = WinList() ; EndFunc ;==>_AddWindows Func IsVisible($handle) If BitAND(WinGetState($handle), 2) Then Return 1 Else Return 0 EndIf EndFunc ;==>IsVisible Edited January 28, 2009 by Manadar github.com/jvanegmond
Dampe Posted January 28, 2009 Author Posted January 28, 2009 What I found out by debugging your application, is that this happens: Checking hWnd SciTE interface Checking hWnd TF_FloatingLangBar_WndTitle Checking hWnd CiceroUIWndFrame Checking hWnd Checking hWnd Start Menu Checking hWnd Checking hWnd Checking hWnd Checking hWnd As you can see it checks the name of the application. However, a name is not a very good identifier for a window, because a name changes. To get around this problem we use the window handle (or known as hWnd) which is a unique identifier for any window. I did also change the two for loops. You shouldn't use the same name, because it gives unexpected results. Here's the fixed application using window handles, instead of names. expandcollapse popup#include <GUIConstants.au3> #include <WindowsConstants.au3> #include <GuiButton.au3> #include <ButtonConstants.au3> #include <StaticConstants.au3> #include <Array.au3> Dim $WinBtns[1] Dim $BarWinList = WinList() Dim $DesktopMin = False Opt("GUIOnEventMode", 1) _Draw() While 1 Sleep(10) _CheckWindows() WEnd Func _CheckWindows() For $i = 1 To $BarWinList[0][0] If Not WinExists($BarWinList[$i][1]) Then For $x = 1 to UBound ($WinBtns) -1 Step 1 GUICtrlDelete ($WinBtns[$x]) Next $BarWinList = "" _AddWindows() ExitLoop EndIf Next EndFunc ;==>_CheckWindows Func _Draw() $GUI = GUICreate("", @DesktopWidth, 30, 0, @DesktopHeight - 30, BitOR($WS_POPUP, $WS_BORDER)) ;//Background GUISetBkColor(0xBB6655) ;//Time $GUILblTime = GUICtrlCreateLabel(@MDAY & "/" & @MON & "/" & @YEAR & " - " & @HOUR & ":" & @MIN, @DesktopWidth - 110, 8, 160, 15) GUICtrlSetColor(-1, 0xFFFFFF) ;GUICtrlSetFont (-1, -1, 800) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) $GUIBtnDesktop = GUICtrlCreateButton("", 7, 4, 22, 22, BitOR($BS_ICON, $BS_FLAT)) GUICtrlSetImage(-1, "shell32.dll", 35, 0) _AddWindows() GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") GUICtrlSetOnEvent($GUIBtnDesktop, "_GoToDesktop") GUISetState(@SW_SHOW) WinSetOnTop($GUI, "", 1) EndFunc ;==>_Draw Func _GoToDesktop() If $DesktopMin = True Then WinMinimizeAllUndo() $DesktopMin = False Else WinMinimizeAll() $DesktopMin = True EndIf EndFunc ;==>_GoToDesktop Func _Exit() Exit 0 EndFunc ;==>_Exit Func _WinClick() WinActivate(_GUICtrlButton_GetText(@GUI_CtrlId)) EndFunc ;==>_WinClick Func _AddWindows() $var = WinList() $Tcount = 1 $BarWinList = "" For $i = 1 To $var[0][0] If $var[$i][0] <> "" And IsVisible($var[$i][1]) Then ;$var[$i][0] ReDim $WinBtns[UBound($WinBtns) + 1] $tText = StringLeft($var[$i][0], 20) $WinBtns[$Tcount] = GUICtrlCreateButton($tText, ($Tcount * 155) - 120, 2, 150, 25, $BS_FLAT) GUICtrlSetBkColor(-1, 0xFFDDAA) GUICtrlSetOnEvent($WinBtns[$Tcount], "_WinClick") $Tcount += 1 EndIf Next $BarWinList = "" $BarWinList = WinList() ; EndFunc ;==>_AddWindows Func IsVisible($handle) If BitAND(WinGetState($handle), 2) Then Return 1 Else Return 0 EndIf EndFunc ;==>IsVisible Problem solved. Thanks a bunch Manadar
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