Jump to content

Recommended Posts

Posted (edited)

I have created a settings window, but when it hid behind my browser, I forgot it was still open, so i clicked the button to open it again, which did nothing. I've spent all day today trying to figure out how to get the window to be brought to the front, ie, topmost, and for the button that opens it to not respond to further clicks if it is open, but everything is not working for me. Please can someone help...
Here's my SettingsGUI.au3:
 

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <GuiListView.au3>
#include <File.au3>
#include <WinAPIFiles.au3>
#include <GuiTab.au3>
#include <GuiEdit.au3>
#include <GuiButton.au3>
#include <GuiComboBox.au3>
#include <GuiListBox.au3>
#include <GuiSlider.au3>
#include <GuiMenu.au3>
#include <Misc.au3>

Global $g_hGUI = 0, $g_hTab
Global $g_aCheckBoxCtrlIDs[0], $g_aCheckBoxNames[0]
Global $g_hSandBoxieInput, $hSandBoxieBrowse
Global $hScanLV, $hScanLV_Handle, $btnAddScan, $btnEditScan, $btnDeleteScan, $btnDebugLV, $btnScan
Global $g_aScanPaths[0], $g_aScanDepths[0]
Global $btnOK, $btnCancel

Func _DebugListView()
    Local $selText = GUICtrlRead($hScanLV)
    MsgBox(64, "DEBUG", "GUICtrlRead result: " & $selText)
    If $selText <> "" Then
        Local $parts = StringSplit($selText, "|")
        If $parts[0] >= 3 Then
            MsgBox(64, "DEBUG", "Selected index: " & (Number($parts[1]) - 1) & @CRLF & _
                "Path: " & $parts[2] & @CRLF & "Depth: " & $parts[3])
        EndIf
    EndIf
EndFunc

Func ShowSettingsGUI()
    Global $g_hGUI, $g_SettingsOpen
    $g_SettingsOpen = True
    $g_hGUI = GUICreate("Settings", 700, 420, -1, -1, $WS_SYSMENU)
    $g_hTab = GUICtrlCreateTab(10, 10, 680, 380)
    TrayItemSetState($TRAY_SETTINGS, $TRAY_DISABLE)
    ; --- Global Tab ---
    GUICtrlCreateTabItem("Global")
    SetupGlobalTab()
    ; --- Buttons Tab (NEW TAB #2) ---
    GUICtrlCreateTabItem("Buttons")
    SetupButtonsTab()
    ; --- About Tab (now TAB #3) ---
    GUICtrlCreateTabItem("About")
    SetupAboutTab()
    GUICtrlCreateTabItem("") ; End tab items
    ; OK and Cancel buttons - Always visible, not part of tabs
    $btnOK     = GUICtrlCreateButton("OK", 510, 350, 80, 30)
    $btnCancel = GUICtrlCreateButton("Cancel", 600, 350, 80, 30)
    GUISetState(@SW_SHOW, $g_hGUI)

    While 1
        Local $msg = GUIGetMsg()
        Switch $msg
            Case $GUI_EVENT_CLOSE
                ExitLoop
            ; Add any button handlers for the Buttons tab here, e.g.:
            ; Case $btnMyButton
            ;     ; Do something
            Case $btnAddScan
                _AddScanPath()
            Case $btnEditScan
                _EditScanPath()
            Case $btnDeleteScan
                _DeleteScanPath()
            Case $btnDebugLV
                _DebugListView()
            Case $btnScan
                SaveScanPathsToINI()
                ScanAppsFolders()
            Case $hSandBoxieBrowse
                Local $exePath = FileOpenDialog("Select SandMan.exe (Sandboxie)", @ScriptDir, "Executable (*.exe)", 1)
                If @error Or $exePath = "" Then ContinueLoop
                GUICtrlSetData($g_hSandBoxieInput, $exePath)
            Case $g_AboutLinkCtrl
                ShellExecute($g_AboutLinkURL)
            Case $btnOK
                SaveGlobalTab()
                SaveScanPathsToINI()
                ExitLoop
            Case $btnCancel
                ExitLoop
        EndSwitch
    WEnd
    GUIDelete($g_hGUI)
    $g_hGUI = 0
    $g_SettingsOpen = False
    TrayItemSetState($TRAY_SETTINGS, $TRAY_ENABLE)
EndFunc

Func SetupGlobalTab()
    Local $iY = 50
    GUICtrlCreateLabel("Scan Paths", 20, $iY, 100, 20)
    $hScanLV = GUICtrlCreateListView("#|Path|Depth", 20, $iY + 20, 600, 180, $LVS_SHOWSELALWAYS + $LVS_SINGLESEL)
    $hScanLV_Handle = GUICtrlGetHandle($hScanLV)
    _GUICtrlListView_SetColumnWidth($hScanLV_Handle, 0, 40)
    _GUICtrlListView_SetColumnWidth($hScanLV_Handle, 1, 480) ; Path column enlarged!
    _GUICtrlListView_SetColumnWidth($hScanLV_Handle, 2, 50)
    $btnAddScan    = GUICtrlCreateButton("Add",      630, $iY + 25, 50, 25)
    $btnEditScan   = GUICtrlCreateButton("Edit",     630, $iY + 60, 50, 25)
    $btnDeleteScan = GUICtrlCreateButton("Delete",   630, $iY + 95, 50, 25)
    $btnDebugLV    = GUICtrlCreateButton("Debug LV", 630, $iY + 130, 60, 25)
    $btnScan       = GUICtrlCreateButton("Scan",     630, $iY + 170, 50, 25)
    GUICtrlSetState($btnDebugLV, $GUI_HIDE)

    Local $iY2 = $iY + 210
    Local $aSettings = IniReadSection(@ScriptDir & "\App\Settings.ini", "GLOBAL")
    If @error Then Return
    Global $g_aCheckBoxCtrlIDs[0], $g_aCheckBoxNames[0]
    For $i = 1 To $aSettings[0][0]
        Local $key = $aSettings[$i][0]
        Local $val = $aSettings[$i][1]
        If StringRegExp($key, "^Scan\d+$") Or StringRegExp($key, "^Scan\d+Depth$") Then
            ContinueLoop
        EndIf
        If $val = "1" Or $val = "0" Then
            Local $id = GUICtrlCreateCheckbox($key, 30, $iY2, 200, 20)
            GUICtrlSetState($id, ($val = "1") ? $GUI_CHECKED : $GUI_UNCHECKED)
            _ArrayAdd($g_aCheckBoxCtrlIDs, $id)
            _ArrayAdd($g_aCheckBoxNames, $key)
            $iY2 += 30
        EndIf
    Next

    GUICtrlCreateLabel("Sandboxie Executable Path (SandMan.exe):", 30, $iY2, 250, 20)
    Local $sandboxieValue = IniRead(@ScriptDir & "\App\Settings.ini", "GLOBAL", "SandboxiePath", "")
    $g_hSandBoxieInput = GUICtrlCreateInput($sandboxieValue, 30, $iY2 + 25, 250, 20)
    $hSandBoxieBrowse = GUICtrlCreateButton("...", 250, $iY2 -4, 30, 22)

    _LoadScanPathsFromINI()
    _RefreshScanListView()
EndFunc

Func SaveGlobalTab()
    For $i = 0 To UBound($g_aCheckBoxCtrlIDs) - 1
        Local $state = GUICtrlRead($g_aCheckBoxCtrlIDs[$i])
        Local $val = ($state = $GUI_CHECKED) ? "1" : "0"
        IniWrite(@ScriptDir & "\App\Settings.ini", "GLOBAL", $g_aCheckBoxNames[$i], $val)
    Next
    Local $sandboxiePath = GUICtrlRead($g_hSandBoxieInput)
    IniWrite(@ScriptDir & "\App\Settings.ini", "GLOBAL", "SandboxiePath", $sandboxiePath)
EndFunc

Func _LoadScanPathsFromINI()
    Global $g_aScanPaths[0], $g_aScanDepths[0]
    Local $i = 1
    While True
        Local $path = IniRead(@ScriptDir & "\App\Settings.ini", "GLOBAL", "Scan" & $i, "")
        If $path = "" Then ExitLoop
        Local $depth = IniRead(@ScriptDir & "\App\Settings.ini", "GLOBAL", "Scan" & $i & "Depth", "1")
        _ArrayAdd($g_aScanPaths, $path)
        _ArrayAdd($g_aScanDepths, $depth)
        $i += 1
    WEnd
EndFunc

; --- New combined dialog for path/depth ---
Func ShowScanPathDialog($sPath = "", $sDepth = "1", $bEdit = False)
    Local $title = $bEdit ? "Edit Scan Path" : "Add Scan Path"
    Local $hDlg = GUICreate($title, 365, 150, -1, -1, $WS_SYSMENU)
    GUICtrlCreateLabel("Scan Path:", 10, 14, 70, 22)
    Local $inpPath = GUICtrlCreateInput($sPath, 80, 10, 220, 20)
    Local $btnBrowse = GUICtrlCreateButton("...", 310, 9, 40, 22)
    GUICtrlCreateLabel("Scan Depth:", 10, 50, 70, 22)
    Local $cboDepth = GUICtrlCreateCombo("", 80, 46, 60, 22)
    GUICtrlCreateLabel("1 = Scan path folder, 2 = Sub folder, etc.", 150, 50, 200, 22)
    For $i = 1 To 10
        GUICtrlSetData($cboDepth, $i)
    Next
    GUICtrlSetData($cboDepth, $sDepth)
    Local $btnOK = GUICtrlCreateButton("OK", 180, 85, 80, 30)
    Local $btnCancel = GUICtrlCreateButton("Cancel", 270, 85, 80, 30)
    GUISetState(@SW_SHOW, $hDlg)

    Local $result[2] = ["", ""]
    While 1
        Local $msg = GUIGetMsg()
        Select
            Case $msg = $GUI_EVENT_CLOSE Or $msg = $btnCancel
                ExitLoop
            Case $msg = $btnBrowse
                Local $selectedFolder = FileSelectFolder("Select folder for Scan Path", "", 1)
                If Not @error And $selectedFolder <> "" Then
                    GUICtrlSetData($inpPath, $selectedFolder)
                EndIf
            Case $msg = $btnOK
                $result[0] = GUICtrlRead($inpPath)
                Local $depth = GUICtrlRead($cboDepth)
                ; Auto-correct depth between 1 and 10
                If Not StringIsInt($depth) Then
                    $depth = 1
                ElseIf $depth < 1 Then
                    $depth = 1
                ElseIf $depth > 10 Then
                    $depth = 10
                EndIf
                $result[1] = $depth
                ExitLoop
        EndSelect
    WEnd
    GUIDelete($hDlg)
    Return $result
EndFunc

Func _AddScanPath()
    Local $vals = ShowScanPathDialog("", "1", False)
    If $vals[0] = "" Then Return
    If $vals[1] = "" Then $vals[1] = "1"
    _ArrayAdd($g_aScanPaths, $vals[0])
    _ArrayAdd($g_aScanDepths, $vals[1])
    _RefreshScanListView()
EndFunc

Func _GetSelectedIndex()
    Local $count = _GUICtrlListView_GetItemCount($hScanLV_Handle)
    For $i = 0 To $count - 1
        If _GUICtrlListView_GetItemSelected($hScanLV_Handle, $i) Then
            Return $i
        EndIf
    Next
    Return -1
EndFunc

Func _EditScanPath()
    Local $selIndex = _GetSelectedIndex()
    If $selIndex = -1 Then
        MsgBox(16, "Edit Scan Path", "Please select a scan path to edit.")
        Return
    EndIf
    Local $currPath = $g_aScanPaths[$selIndex]
    Local $currDepth = $g_aScanDepths[$selIndex]
    Local $vals = ShowScanPathDialog($currPath, $currDepth, True)
    If $vals[0] = "" Then Return
    If $vals[1] = "" Then $vals[1] = "1"
    $g_aScanPaths[$selIndex] = $vals[0]
    $g_aScanDepths[$selIndex] = $vals[1]
    _RefreshScanListView()
EndFunc

Func _DeleteScanPath()
    Local $selIndex = _GetSelectedIndex()
    If $selIndex = -1 Then
        MsgBox(16, "Delete Scan Path", "Please select a scan path to delete.")
        Return
    EndIf
    _ArrayDelete($g_aScanPaths, $selIndex)
    _ArrayDelete($g_aScanDepths, $selIndex)
    _RefreshScanListView()
EndFunc

Func _RefreshScanListView()
    _GUICtrlListView_DeleteAllItems($hScanLV_Handle)
    For $i = 0 To UBound($g_aScanPaths) - 1
        GUICtrlCreateListViewItem(StringFormat("%d|%s|%s", $i+1, $g_aScanPaths[$i], $g_aScanDepths[$i]), $hScanLV)
    Next
EndFunc

Func SaveScanPathsToINI()
    Local $i = 1
    While True
        Local $old = IniRead(@ScriptDir & "\App\Settings.ini", "GLOBAL", "Scan" & $i, "")
        If $old = "" Then ExitLoop
        IniDelete(@ScriptDir & "\App\Settings.ini", "GLOBAL", "Scan" & $i)
        IniDelete(@ScriptDir & "\App\Settings.ini", "GLOBAL", "Scan" & $i & "Depth")
        $i += 1
    WEnd
    For $j = 0 To UBound($g_aScanPaths) - 1
        IniWrite(@ScriptDir & "\App\Settings.ini", "GLOBAL", "Scan" & ($j + 1), $g_aScanPaths[$j])
        IniWrite(@ScriptDir & "\App\Settings.ini", "GLOBAL", "Scan" & ($j + 1) & "Depth", $g_aScanDepths[$j])
    Next
EndFunc


;~ If True Then ShowSettingsGUI()

And here's the button to open the settings:
 

Func Buttons_OpenSettings()
    Global $g_hGUI, $g_SettingsOpen
    ; Don't queue - only allow if not open
    If $g_SettingsOpen And WinExists($g_hGUI) Then
        WinActivate($g_hGUI)
        Return
    EndIf
    ; Set flag BEFORE calling GUI function to prevent queue
    $g_SettingsOpen = True
    ShowSettingsGUI()
EndFunc

I'd appreciate a lot if someone could put me out of my misery!!! Thanks. 😁

Edited by sl23
Posted
40 minutes ago, sl23 said:

I forgot it was still open, so i clicked the button to open it again,

Func main()
    Local $sTitleEx = "[TITLE:" & StringTrimRight(@ScriptName, 4) & ";CLASS:AutoIt v3 GUI;]"
    If WinExists($sTitleEx) Then
        WinActivate($sTitleEx)
        Local $aPos = WinGetPos($sTitleEx)
        If UBound($aPos) = 4 Then
            For $n = 1 To 5
                WinMove($sTitleEx, "", $aPos[0] - 20, $aPos[1] + 20)
                Sleep(50)
                WinMove($sTitleEx, "", $aPos[0] + 20, $aPos[1] - 20)
                Sleep(50)
            Next
            WinMove($sTitleEx, "", $aPos[0], $aPos[1])
        EndIf
        Exit
    EndIf
    .... the rest of your code ....

 

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Posted
43 minutes ago, sl23 said:
    Local $title = $bEdit ? "Edit Scan Path" : "Add Scan Path"
    Local $hDlg = GUICreate($title, 365, 150, -1, -1, $WS_SYSMENU)

oops, my bad.

GUICreate ( "title" [, width [, height [, left = -1 [, top = -1 [, style = -1 [, exStyle = -1 [, parent = 0]]]]]]] )
Just tell your new GUI that it has a parent and they'll stick together.

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Posted

Thanks, I did try that here but it didn't work, I must have it wrong somehow:
 

Func ShowSettingsGUI()
    Global $g_hGUI, $g_SettingsOpen
    $g_SettingsOpen = True
    TrayItemSetState($TRAY_SETTINGS, $TRAY_DISABLE)
    $g_hGUI = GUICreate("Settings", 700, 420, -1, -1, $WS_SYSMENU)
    $g_hTab = GUICtrlCreateTab(10, 10, 680, 380)
    ; --- Global Tab ---
    GUICtrlCreateTabItem("Global")
    SetupGlobalTab()
    ; --- Buttons Tab (NEW TAB #2) ---
    GUICtrlCreateTabItem("Buttons")
    SetupButtonsTab()
    ; --- About Tab (now TAB #3) ---
    GUICtrlCreateTabItem("About")
    SetupAboutTab()
    GUICtrlCreateTabItem("") ; End tab items
    ; OK and Cancel buttons - Always visible, not part of tabs
    $btnOK     = GUICtrlCreateButton("OK", 510, 350, 80, 30)
    $btnCancel = GUICtrlCreateButton("Cancel", 600, 350, 80, 30)
    GUISetState(@SW_SHOW, $g_hGUI)

    While 1
        Local $msg = GUIGetMsg()
        Switch $msg
            Case $GUI_EVENT_CLOSE
                ExitLoop
            ; Add any button handlers for the Buttons tab here, e.g.:
            ; Case $btnMyButton
            ;     ; Do something
            Case $btnAddScan
                _AddScanPath()
            Case $btnEditScan
                _EditScanPath()
            Case $btnDeleteScan
                _DeleteScanPath()
            Case $btnDebugLV
                _DebugListView()
            Case $btnScan
                SaveScanPathsToINI()
                ScanAppsFolders()
            Case $hSandBoxieBrowse
                Local $exePath = FileOpenDialog("Select SandMan.exe (Sandboxie)", @ScriptDir, "Executable (*.exe)", 1)
                If @error Or $exePath = "" Then ContinueLoop
                GUICtrlSetData($g_hSandBoxieInput, $exePath)
            Case $g_AboutLinkCtrl
                ShellExecute($g_AboutLinkURL)
            Case $btnOK
                SaveGlobalTab()
                SaveScanPathsToINI()
                ExitLoop
            Case $btnCancel
                ExitLoop
        EndSwitch
    WEnd
    GUIDelete($g_hGUI)
    $g_hGUI = 0
    $g_SettingsOpen = False
    TrayItemSetState($TRAY_SETTINGS, $TRAY_ENABLE)
EndFunc

I used TrayItemSetState()  at the top and bottom, to create the gui, disable the  tray item and on close, to enable it again, as it was the tray item I wanted to disable until the window has closed. Least that was the only way I could think of to stop multiple windows opening one after the other.

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...