Jump to content
JoshuaBarnette

Other Window Control Highlighting

Recommended Posts

JoshuaBarnette

I would like to choose a window from a list, gather all the controls on that window, then select a control from the resulting list and "highlight" it on the original window much like is done in either the AutoIT Info Tool or Yashied's Control Viewer. The issues that I am having are:

  1. Identifying when the ListView is clicked and what row is clicked
  2. Then highlighting the field on the original window

The reason for this script is not just for visualizing the controls, but to help identify specific pixel positions and colors for controls that require ControlClick such as a list of CheckBoxes in a List that does not list specific control IDs for each.

So far I have the code below, I have also attached the non-standard (not out of the box) UDFs I am using:

; ======================================================================================================================================================
; = Resize A Window Script                                                                                                                             =
; ======================================================================================================================================================
#Region ; Script ChangeLog
; ======================================================================================================================================================
    Dim $Script_ChangeLog[3][2]

    $Script_ChangeLog[1][0] = "Version"
    $Script_ChangeLog[1][1] = "ChangeLog"
    $Script_ChangeLog[2][0] = "15.10.28"
    $Script_ChangeLog[2][1] = "Original Script."

    $Script_ChangeLog[0][0] = UBound($Script_ChangeLog) - 1
    $Script_ChangeLog[0][1] = "Entries"

    _ArraySort($Script_ChangeLog, 1, 2, 0, 0)
; ======================================================================================================================================================
#EndRegion ; Script ChangeLog
; ======================================================================================================================================================
#Region ; Necessary Options
; ======================================================================================================================================================
    Opt("GUICloseOnESC", 0) ; 0=ESC Won't Close, 1=ESC Closes
    Opt("TrayIconHide", 1) ; 1=Hides Icon, 0=Shows Icon
    Opt("TrayMenuMode", 1) ; Default tray menu items (Script Paused/Exit) will not be shown.
    ; ==================================================================================================================================================
    Global $Script_Name = FileGetVersion(@ScriptFullPath, "ProductName")
    Global $Script_Version = FileGetVersion(@ScriptFullPath, "ScriptVersion")
    Global $Script_FileName = FileGetVersion(@ScriptFullPath, "OriginalFileName")
; ======================================================================================================================================================
#EndRegion ; Necessary Options
; ======================================================================================================================================================
#Region ; Necessary Includes
; ======================================================================================================================================================
    $Script_Exists = ProcessList(@ScriptName)
    If $Script_Exists[0][0] > 1 Then
;       MsgBox(64, $Script_Name & ' Warning', 'An instance of this application is already running.')
        If WinExists($Script_Name & " " & $Script_Version) Then
            WinActivate($Script_Name & " " & $Script_Version)
        Else
            Send("^!w")
        EndIf
        Exit
    EndIf
    ; ==================================================================================================================================================
    #Region ; JB2_SplashScreen Dependencies
    ; ==================================================================================================================================================
        Global Const $JB2_SplashScreen_AC_SRC_ALPHA = 1
        #Include <Resources.au3>
        #Include <GUIConstantsEx.au3>
        #Include <StaticConstants.au3>
        #Include <WindowsConstants.au3>
    ; ==================================================================================================================================================
    #EndRegion ; JB2_SplashScreen Dependencies
    ; ==================================================================================================================================================
    JB2_SplashScreen("On")
    JB2_SplashScreen("Update", "Loading Dependencies...")
    #Include <Array.au3>
    #Include <ShowMonitorInfo.au3>
    #Include <TrayMenuIcons.au3>
    #Include <WinAPI.au3>
    ; ==================================================================================================================================================
    #Region ; GUI Includes
    ; ==================================================================================================================================================
        #Include <ButtonConstants.au3>
        #Include <Constants.au3>
        #Include <ComboConstants.au3>
        #Include <EditConstants.au3>
        #Include <GDIPlus.au3>
        #Include <GuiButton.au3>
        #Include <GuiEdit.au3>
        #Include <GUIExtender.au3>
        #Include <GuiListBox.au3>
        #Include <GuiListView.au3>
        #include <ListboxConstants.au3>
        #Include <ListviewConstants.au3>
        #Include <Misc.au3>
        #Include <ScrollBarConstants.au3>
    ; ==================================================================================================================================================
    #EndRegion ; GUI Includes
; ======================================================================================================================================================
#EndRegion ; Necessary Includes
; ======================================================================================================================================================
#Region ; Necessary Variables
; ======================================================================================================================================================
    HotKeySet("^!p", "Pixels2Table_GUI")
    HotKeySet("^!q", "_OnExitWithMsg")
; ======================================================================================================================================================
    If StringInStr(@OSVersion, "7") Then
        $Taskbar_Specs = ControlGetPos("[Class:Shell_TrayWnd]", "", "ToolbarWindow321")
    Else
        $Taskbar_Specs = ControlGetPos("[Class:Shell_TrayWnd]", "", "ToolbarWindow322")
    EndIf
    If $Taskbar_Specs[3] = "" Then
        $Taskbar_Specs[3] = 22
    EndIf
    Global $Progress_Top = Number(@DesktopHeight - Number(138 + $Taskbar_Specs[3])); Progress Window Default Height Is 128 Offset By 10 For Effect & 46 For TaskBar
    Global $Progress_Left = Number(@DeskTopWidth - 316); Progress Window Default Width Is 306 Offset By 10 For Effect
; ======================================================================================================================================================
    Global $WindowList = ''
    Global $RWG_GUI = 'Closed'
    Global $RWG_OpenWindow_List = ''
    Global $RWG_OpenWindow_List_Content = ''
    Global $RWG_OpenWindow_List_CurrentContent = ''
    Global $RWG_WindowTitle_Edit = ''
    Global $RWG_WindowStart_Edit = ''
    Global $RWG_WindowResolution_Edit = ''
    Global $RWG_WindowState_Edit = ''
    Global $RWG_WindowMonitor_Edit = ''
    Global $RWG_WindowMonitorResolution_Edit = ''
    Global $RWG_WindowControlVisible_CheckBox = ''
    Global $RWG_WindowControlVisible = True
    Global $RWG_WindowControl_ListView = ''
; ======================================================================================================================================================
    Global $P2T_FileName = @TempDir & '\P2T_Layout.html'
    Global $P2T_Header = '<!DOCTYPE html>' & @CRLF & _
                         '<html>' & @CRLF & _
                         @TAB & '<head>' & @CRLF & _
                         @TAB & @TAB & '<title>Pixel To Table</title>' & @CRLF & _
                         @TAB & @TAB & '<meta charset="UTF-8">' & @CRLF & _
                         @TAB & @TAB & '<style>' & @CRLF & _
                         @TAB & @TAB & @TAB & 'td' & @CRLF & _
                         @TAB & @TAB & @TAB & '{' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'position: relative;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'color: rgb(0,0,0);' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'height: 35px;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'width: 35px;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'font-family: Calibri, Arial, sans-serif;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'font-size: xx-small;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'text-align: center;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'text-decoration: none;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'z-index: 20;' & @CRLF & _
                         @TAB & @TAB & @TAB & '}' & @CRLF & @CRLF & _
                         @TAB & @TAB & @TAB & 'td span.cellcontent' & @CRLF & _
                         @TAB & @TAB & @TAB & '{' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'display: block;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'min-width: 35px;' & @CRLF & _
                         @TAB & @TAB & @TAB & '}' & @CRLF & @CRLF & _
                         @TAB & @TAB & @TAB & 'td:hover' & @CRLF & _
                         @TAB & @TAB & @TAB & '{' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'z-index: 30; ' & @CRLF & _
                         @TAB & @TAB & @TAB & '}' & @CRLF & @CRLF & _
                         @TAB & @TAB & @TAB & 'td span.hoverbox' & @CRLF & _
                         @TAB & @TAB & @TAB & '{' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'display: none;' & @CRLF & _
                         @TAB & @TAB & @TAB & '}' & @CRLF & @CRLF & _
                         @TAB & @TAB & @TAB & 'td:hover span.hoverbox' & @CRLF & _
                         @TAB & @TAB & @TAB & '{ ' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'display: block;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'position: absolute;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'top: 30px; ' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'left: 30px; ' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'width: 200px; /* auto */' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'padding: 10px;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'color: rgb(255,255,255);' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'font-family: Cambria, Times New Roman, serif;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'font-size: 24px;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'font-weight: bold;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'text-align: left;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'line-height: 28px;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'border: 1px solid rgb(51,51,51);' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'background-color: rgb(102,102,102);' & @CRLF & _
                         @TAB & @TAB & @TAB & '}' & @CRLF & @CRLF & _
                         @TAB & @TAB & @TAB & 'span.hoverboxbody' & @CRLF & _
                         @TAB & @TAB & @TAB & '{' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'font-family: Calibri, Arial, sans-serif;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'font-size: 20px; ' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'font-weight: normal;' & @CRLF & _
                         @TAB & @TAB & @TAB & @TAB & 'line-height: 22px;' & @CRLF & _
                         @TAB & @TAB & @TAB & '}' & @CRLF & @CRLF & _
                         @TAB & @TAB & '</style>' & @CRLF & _
                         @TAB & '</head>' & @CRLF & _
                         @TAB & '<body>' & @CRLF & _
                         @TAB & @TAB & '<table style="border-collapse: collapse;">' & @CRLF
    Global $P2T_Footer = @TAB & @TAB & '</table>' & @CRLF & _
                         @TAB & '</body>' & @CRLF & _
                         '</html>' & @CRLF & @CRLF
; ======================================================================================================================================================
#EndRegion ; Necessary Variables
; ======================================================================================================================================================
JB2_SplashScreen("Off")
; ======================================================================================================================================================
#Region ; Script Body
; ======================================================================================================================================================
$RWG_GUI = GUICreate($Script_Name & " " & $Script_Version, 780, 680, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX))
; ==================================================================================================================================
#Region ; Menu Section
; ==================================================================================================================================
    $RWG_File_Menu = GUICtrlCreateMenu('&File')
        $RWG_Exit_MenuItem = GUICtrlCreateMenuItem('E&xit' & @TAB & 'Ctrl+Alt+Q', $RWG_File_Menu)
    $RWG_View_Menu = GUICtrlCreateMenu('&View')
        $RWG_RefreshWindowList_MenuItem = GUICtrlCreateMenuItem('&Refresh Window List...', $RWG_View_Menu)
    $RWG_Help_Menu = GUICtrlCreateMenu('&Help')
        $RWG_ChangeLog_MenuItem = GUICtrlCreateMenuItem('View Change &Log...', $RWG_Help_Menu)
        GUICtrlCreateMenuItem('', $RWG_Help_Menu)
        $RWG_About_MenuItem = GUICtrlCreateMenuItem('&About...', $RWG_Help_Menu)
; ==================================================================================================================================
#EndRegion ; Menu Section
; ==================================================================================================================================
    $RWG_OpenWindow_Label = GUICtrlCreateLabel("Select A Window To Resize:", 10, 10, 600, 20, $SS_CENTER)
    $RWG_OpenWindow_List = GUICtrlCreateList("", 10, 30, 600, 300)
        Refresh_WindowList(0)
    $RWG_WindowInfo_Label = GUICtrlCreateLabel("Window Information:", 620, 10, 150, 20, $SS_CENTER)
    GUICtrlCreateGroup('', 620, 23, 150, 260)
        $RWG_WindowMonitor_Label = GUICtrlCreateLabel("Located On:", 630, 40, 130, 20, $SS_CENTER)
            GUICtrlSetBkColor($RWG_WindowMonitor_Label, $GUI_BKCOLOR_TRANSPARENT)
        $RWG_WindowMonitor_Edit = GUICtrlCreateEdit("", 630, 60, 130, 22, BitOR($ES_READONLY, $ES_CENTER))
        $RWG_WindowStart_Label = GUICtrlCreateLabel("Start Position (Left x Top):", 630, 85, 130, 20, $SS_CENTER)
            GUICtrlSetBkColor($RWG_WindowStart_Label, $GUI_BKCOLOR_TRANSPARENT)
        $RWG_WindowStart_Edit = GUICtrlCreateEdit("", 630, 105, 130, 22, BitOR($ES_READONLY, $ES_CENTER))
        $RWG_WindowResolution_Label = GUICtrlCreateLabel("Current Resolution:", 630, 130, 130, 20, $SS_CENTER)
            GUICtrlSetBkColor($RWG_WindowResolution_Label, $GUI_BKCOLOR_TRANSPARENT)
        $RWG_WindowResolution_Edit = GUICtrlCreateEdit("", 630, 150, 130, 22, BitOR($ES_READONLY, $ES_CENTER))
        $RWG_WindowState_Label = GUICtrlCreateLabel("Maximized Or Minimized:", 630, 180, 130, 20, $SS_CENTER)
            GUICtrlSetBkColor($RWG_WindowState_Label, $GUI_BKCOLOR_TRANSPARENT)
        $RWG_WindowState_Edit = GUICtrlCreateEdit("", 630, 200, 130, 22, BitOR($ES_READONLY, $ES_CENTER))
        $RWG_WindowMonitorResolution_Label = GUICtrlCreateLabel("Monitor Resolution:", 630, 225, 130, 20, $SS_CENTER)
            GUICtrlSetBkColor($RWG_WindowMonitorResolution_Label, $GUI_BKCOLOR_TRANSPARENT)
        $RWG_WindowMonitorResolution_Edit = GUICtrlCreateEdit("", 630, 245, 130, 22, BitOR($ES_READONLY, $ES_CENTER))
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $RWG_Process_Button = GUICtrlCreateButton('Process Pixels', 620, 293, 150, 30, $BS_DEFPUSHBUTTON)
    $RWG_WindowControl_Label = GUICtrlCreateLabel("Window Controls:", 10, 330, 600, 20, $SS_CENTER)
    $RWG_WindowControlVisible_CheckBox = GUICtrlCreateCheckbox("Show Only Visible Controls", 625, 325)
        GUICtrlSetState($RWG_WindowControlVisible_CheckBox, $GUI_CHECKED)
    $RWG_WindowControl_ListView = GUICtrlCreateListView("Control Handle|Class|Instance|ID|Visible|Left (X)|Top (Y)|Width|Height|Control Text", 10, 350, 760, 300, BitOr($LVS_NOSORTHEADER, $LVS_SINGLESEL), BitOr($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $WS_EX_CLIENTEDGE))
        _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 0, 112)
        _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 0, 2)
        _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 2, 63)
        _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 2, 2)
        _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 4, 56)
        _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 4, 2)
        _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 5, 56)
        _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 5, 2)
        _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 6, 56)
        _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 6, 2)
        _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 7, 56)
        _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 7, 2)
        _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 8, 56)
        _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 8, 2)
        GUICtrlSetBkColor($RWG_WindowControl_ListView, $GUI_BKCOLOR_LV_ALTERNATE)

    Get_WindowInfo(GUICtrlRead($RWG_OpenWindow_List))
    Get_WindowControls(GUICtrlRead($RWG_OpenWindow_List), $RWG_WindowControlVisible)

    GUISetState()

    _GUICtrlListView_ClickItem($RWG_WindowControl_ListView, 0)

    WinSetOnTop($RWG_GUI, '', 1)

    While 1
        $RWG_Msg = GUIGetMsg()
        Switch $RWG_Msg
            Case $GUI_EVENT_CLOSE, $RWG_Exit_MenuItem
                _OnExit()
            Case $RWG_RefreshWindowList_MenuItem
                Refresh_WindowList(0)
                Get_WindowControls(GUICtrlRead($RWG_OpenWindow_List), $RWG_WindowControlVisible)
            Case $RWG_About_MenuItem
                GUISetState(@SW_DISABLE, $RWG_GUI)
                JB2_ThankYou(0, $RWG_GUI, $Script_Name, $Script_Version)
                GUISetState(@SW_ENABLE, $RWG_GUI)
            Case $RWG_ChangeLog_MenuItem
                GUISetState(@SW_DISABLE, $RWG_GUI)
                JB2_ChangeLog($RWG_GUI, $Script_Name, $Script_Version)
                GUISetState(@SW_ENABLE, $RWG_GUI)
            Case $RWG_OpenWindow_List
                Get_WindowInfo(GUICtrlRead($RWG_OpenWindow_List))
                Get_WindowControls(GUICtrlRead($RWG_OpenWindow_List), $RWG_WindowControlVisible)
            Case $RWG_WindowControlVisible_CheckBox
                If BitAND(GUICtrlRead($RWG_WindowControlVisible_CheckBox), $GUI_CHECKED) = $GUI_CHECKED Then
                    $RWG_WindowControlVisible = True
                Else
                    $RWG_WindowControlVisible = False
                EndIf
                Get_WindowControls(GUICtrlRead($RWG_OpenWindow_List), $RWG_WindowControlVisible)
            Case $RWG_WindowControl_ListView
                MsgBox(4096, 'Test', _GUICtrlListView_GetSelectedIndices($RWG_WindowControl_ListView), -1, $RWG_GUI)
            Case $RWG_Process_Button
                $RWG_PB_CurrentSelection = _GUICtrlListView_GetSelectionMark($RWG_WindowControl_ListView)
                $RWG_PB_CurrentSelection_List = _GUICtrlListView_GetItemTextArray($RWG_WindowControl_ListView, $RWG_PB_CurrentSelection)
                $hFrame = _WinAPI_GetParent($RWG_PB_CurrentSelection_List[1])
                
#cs
                GUISetState(@SW_HIDE, $RWG_GUI)
                Pixels2Table(GUICtrlRead($RWG_OpenWindow_List))
                GUISetState(@SW_SHOW, $RWG_GUI)
#CE
        EndSwitch
    WEnd
; ======================================================================================================================================================
#EndRegion ; Script Body
; ======================================================================================================================================================
#Region ; Necessary Supporting Functions
; ======================================================================================================================================================
    #Region ; Get_WindowList Function
    ; ==================================================================================================================================================
        Func Get_WindowList()
            $WindowList = ''
            $Temp_WindowList = WinList()
            $Temp_WindowList_Content = ''

            Dim $WindowList[$Temp_WindowList[0][0]+1][3] ; Declared Globally At The Beginning

            $WindowList[0][0] = $Temp_WindowList[0][0]+1
            For $w = 1 To $Temp_WindowList[0][0]
                ; Windows To Ignore, Both Windows Without A Title And A Windows That Are Not Actually Visible
                If $Temp_WindowList[$w][0] = '' Or $Temp_WindowList[$w][0] = $Script_Name & " " & $Script_Version Or $Temp_WindowList[$w][0] = 'BBar' Or $Temp_WindowList[$w][0] = 'ICA Seamless Host Agent' Or $Temp_WindowList[$w][0] = 'Message' Or $Temp_WindowList[$w][0] = 'OLEChannelWnd' Or $Temp_WindowList[$w][0] = 'Program Manager' Or $Temp_WindowList[$w][0] = 'Splash GUI' Or $Temp_WindowList[$w][0] = 'Start' Or StringRight($Temp_WindowList[$w][0], 5) = 'Toast' Then ContinueLoop

                ; Gets The Handle of The Current Window
                $Temp_WindowState =  WinGetState($Temp_WindowList[$w][1])
#CS
                ; Filtering Windows Based On Window State
                ConsoleWrite($aWindows[$i][0] & ': ')
                If BitAND($Temp_WindowState, 1) = 1 Then ConsoleWrite(' exists')
                If BitAND($Temp_WindowState, 2) = 2 Then ConsoleWrite(' visible')
                If BitAND($Temp_WindowState, 4) = 4 Then ConsoleWrite(' enabled')
                If BitAND($Temp_WindowState, 8) = 8 Then ConsoleWrite(' active')
                If BitAND($Temp_WindowState, 16) = 16 Then ConsoleWrite(' minimized')
                If BitAND($Temp_WindowState, 32) = 32 Then ConsoleWrite(' maximized')
                ConsoleWrite(@CRLF)
#CE
                If BitAND($Temp_WindowState, 2) = 2 Then
                    $WindowList[$w][0] = $Temp_WindowList[$w][0]
                    $WindowList[$w][1] = $Temp_WindowList[$w][1]
                    If BitAND($Temp_WindowState, 8) = 8 Then $WindowList[$w][2] &= 'Active / '
                    If BitAND($Temp_WindowState, 16) = 16 Then $WindowList[$w][2] &= 'Minimized / '
                    If BitAND($Temp_WindowState, 32) = 32 Then $WindowList[$w][2] &= 'Maximized'
                    If StringRight($WindowList[$w][2], 3) = ' / ' Then $WindowList[$w][2] = StringTrimRight($WindowList[$w][2], 3)
                    If StringInStr($Temp_WindowList[$w][0], '|') Then $Temp_WindowList[$w][0] = StringReplace($Temp_WindowList[$w][0], '|', '[JB' & Chr(178) & ']')
                    $Temp_WindowList_Content &= $Temp_WindowList[$w][0] & '|'
                EndIf
            Next

            _ArraySort($WindowList, 0, 1, 0, 0)
            $WindowList = JB2_DeleteEmpty2DArrayRows($WindowList) ; Column Structure: 0 = WindowTitle / 1 = WindowHandle
            $WindowList[0][0] = UBound($WindowList) - 1

            If StringRight($Temp_WindowList_Content, 1) = '|' Then $Temp_WindowList_Content = StringTrimRight($Temp_WindowList_Content, 1)
            Return $Temp_WindowList_Content
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; Get_WindowList Function
    ; ==================================================================================================================================================
    #Region ; Get_WindowInfo Function
    ; ==================================================================================================================================================
        Func Get_WindowInfo($GWL_Title)
            GUICtrlSetData($RWG_WindowTitle_Edit, '')
            GUICtrlSetData($RWG_WindowStart_Edit, '')
            GUICtrlSetData($RWG_WindowResolution_Edit, '')
            GUICtrlSetData($RWG_WindowState_Edit, '')
            GUICtrlSetData($RWG_WindowMonitor_Edit, '')
            GUICtrlSetData($RWG_WindowMonitorResolution_Edit, '')
            $GWL_TempState = ''
            If StringInStr($GWL_Title, '[JB' & Chr(178) & ']') Then $GWL_Title = StringReplace($GWL_Title, '[JB' & Chr(178) & ']', '|')
            $GWL_CurrentWindow_ListPosition = _ArraySearch($WindowList, $GWL_Title)
            $GWL_Handle = $WindowList[$GWL_CurrentWindow_ListPosition][1]
            If StringInStr($WindowList[$GWL_CurrentWindow_ListPosition][2], 'Maximized') Then
                $GWL_State = 'Maximized'
            ElseIf StringInStr($WindowList[$GWL_CurrentWindow_ListPosition][2], 'Minimized') Then
                $GWL_State = 'Minimized'
            Else
                $GWL_State = 'No'
            EndIf

            _GetMonitors()

            If $GWL_State = 'Minimized' Then
                WinSetState($GWL_Handle, '', @SW_RESTORE)
                $GWL_TempState = WinGetState($GWL_Handle) ; To Determine If The Minimized Window Is Maximized If Restored.
                $Temp_WinInfo = WinGetPos($GWL_Handle)
                WinSetState($GWL_Handle, '', @SW_MINIMIZE)
            Else
                $Temp_WinInfo = WinGetPos($GWL_Handle)
            EndIf

            If IsArray($Temp_WinInfo) Then
                If UBound($Temp_WinInfo) = 4 Then
                    If $GWL_State = 'Maximized' Or BitAND($GWL_TempState, 32) = 32 Then
                        $Temp_WinInfo[0] += 8
                        $Temp_WinInfo[1] += 8
                    EndIf

                    $GWL_Monitor = _GetMonitorFromPoint($Temp_WinInfo[0], $Temp_WinInfo[1])

                    GUICtrlSetData($RWG_WindowStart_Edit, $Temp_WinInfo[0] & 'x' & $Temp_WinInfo[1])
                    GUICtrlSetData($RWG_WindowResolution_Edit, $Temp_WinInfo[2] & 'x' & $Temp_WinInfo[3])
                    GUICtrlSetData($RWG_WindowState_Edit, $GWL_State)
                    GUICtrlSetData($RWG_WindowMonitor_Edit, 'Monitor ' & $GWL_Monitor)
                    GUICtrlSetData($RWG_WindowMonitorResolution_Edit, $__MonitorList[$GWL_Monitor][5] & 'x' & $__MonitorList[$GWL_Monitor][6])
                Else
                    Refresh_WindowList(1, 'The selected window is no longer available.')
                    Get_WindowInfo(GUICtrlRead($RWG_OpenWindow_List))
                EndIf
            Else
                Refresh_WindowList(1, 'The selected window is no longer available.')
                Get_WindowInfo(GUICtrlRead($RWG_OpenWindow_List))
            EndIf
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; Get_WindowInfo Function
    ; ==================================================================================================================================================
    #Region ; Get_WindowControls Function
    ; ==================================================================================================================================================
        Func Get_WindowControls($GWC_Title, $GWC_Visible = True)
            _GUICtrlListView_BeginUpdate($RWG_WindowControl_ListView)
            _GUICtrlListView_DeleteAllItems($RWG_WindowControl_ListView)
            $RWG_WindowControl_ListView_1Width = 13
            $RWG_WindowControl_ListView_3Width = 7
            $RWG_WindowControl_ListView_9Width = 12
            If StringLen($GWC_Title) > $RWG_WindowControl_ListView_9Width Then $RWG_WindowControl_ListView_9Width = StringLen($GWC_Title)

            If StringInStr($GWC_Title, '[JB' & Chr(178) & ']') Then $GWC_Title = StringReplace($GWC_Title, '[JB' & Chr(178) & ']', '|')
            $GWC_CurrentWindow_ListPosition = _ArraySearch($WindowList, $GWC_Title)
            $GWC_Handle = $WindowList[$GWC_CurrentWindow_ListPosition][1]
            $Temp_WinInfo = WinGetPos($GWC_Handle)

            _GUICtrlListView_AddItem($RWG_WindowControl_ListView, $GWC_Handle, 0)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, 'Entire Window', 1)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, 0, 2)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, 0, 3)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, 1, 4)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, $Temp_WinInfo[0], 5)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, $Temp_WinInfo[1], 6)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, $Temp_WinInfo[2], 7)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, $Temp_WinInfo[3], 8)
            _GUICtrlListView_AddSubItem($RWG_WindowControl_ListView, 0, $GWC_Title, 9)

            $GWC_ControlList = JB2_GetWindowControls($GWC_Handle, $GWC_Visible)

            For $li = 1 To $GWC_ControlList[0][0]
                If StringLen($GWC_ControlList[$li][1]) > $RWG_WindowControl_ListView_1Width Then $RWG_WindowControl_ListView_1Width = StringLen($GWC_ControlList[$li][1])
                If StringLen($GWC_ControlList[$li][3]) > $RWG_WindowControl_ListView_3Width Then $RWG_WindowControl_ListView_3Width = StringLen($GWC_ControlList[$li][3])
                If StringLen($GWC_ControlList[$li][9]) > $RWG_WindowControl_ListView_9Width Then $RWG_WindowControl_ListView_9Width = StringLen($GWC_ControlList[$li][9])

                Assign("$RWG_WindowControl_ListView_Row" & Number($li),GUICtrlCreateListViewItem($GWC_ControlList[$li][0] & "|" & $GWC_ControlList[$li][1] & "|" & $GWC_ControlList[$li][2] & "|" & $GWC_ControlList[$li][3] & "|" & $GWC_ControlList[$li][4] & "|" & $GWC_ControlList[$li][5] & "|" & $GWC_ControlList[$li][6] & "|" & $GWC_ControlList[$li][7] & "|" & $GWC_ControlList[$li][8] & "|" & $GWC_ControlList[$li][9], $RWG_WindowControl_ListView))
                GUICtrlSetBkColor(-1, 0xcccccc)
            Next

            _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 1, Number(($RWG_WindowControl_ListView_1Width + 1) * 8)) ; 8px average width of characters at 8pt font.
            _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 1)
            _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 3, Number(($RWG_WindowControl_ListView_3Width + 1) * 7)) ; 7px average width of characters at 8pt numeric font.
            _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 3, 2)
            _GUICtrlListView_SetColumnWidth($RWG_WindowControl_ListView, 9, Number(($RWG_WindowControl_ListView_9Width + 1) * 8)) ; 8px average width of characters at 8pt font.
            _GUICtrlListView_JustifyColumn($RWG_WindowControl_ListView, 9)

            _GUICtrlListView_EndUpdate($RWG_WindowControl_ListView)

            _GUICtrlListView_ClickItem($RWG_WindowControl_ListView, 0)
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; Get_WindowControls Function
    ; ==================================================================================================================================================
    #Region ; Pixels2Table Function
    ; ==================================================================================================================================================
        Func Pixels2Table($P2T_Window)
            ProgressOn("Converting Pixels To HTML Table", "", "", $Progress_Left, $Progress_Top, 2)
            $P2T_CurrentWindow_ListPosition = _ArraySearch($WindowList, $P2T_Window)
            If StringInStr($WindowList[$P2T_CurrentWindow_ListPosition][2], 'Minimized') Then WinSetState($WindowList[$P2T_CurrentWindow_ListPosition][1], '', @SW_RESTORE)
            $P2T_CurrentWindow_Position = WinGetPos($WindowList[$P2T_CurrentWindow_ListPosition][1])
            If StringLen($P2T_CurrentWindow_Position[2]) >= StringLen($P2T_CurrentWindow_Position[3]) Then
                $P2T_XYDigits = StringLen($P2T_CurrentWindow_Position[2])
            Else
                $P2T_XYDigits = StringLen($P2T_CurrentWindow_Position[3])
            EndIf
            WinActivate($WindowList[$P2T_CurrentWindow_ListPosition][1])
            $ProgressTotalItems = Number($P2T_CurrentWindow_Position[2] * $P2T_CurrentWindow_Position[3])
            $ProgressPercentPer = Number(100/$ProgressTotalItems)
            $ProgressProgress = 0
            $ProgressPercent = 0
            $ProgressLabel1 = "0 of " & $ProgressTotalItems & " Pixels(s)"
            $ProgressLabel2 = "0% Completed."
            ProgressSet($ProgressPercent, $ProgressLabel1 & " / " & $ProgressLabel2)
        ; ==============================================================================================================================================
            $P2T_FileHandle = FileOpen($P2T_FileName, 2)
            FileWrite($P2T_FileHandle, $P2T_Header)
        ; ==============================================================================================================================================
            $P2T_Y = 1
            ; For $y = 1 To $P2T_CurrentWindow_Position[3]
            For $y = $P2T_CurrentWindow_Position[1] To Number($P2T_CurrentWindow_Position[1] + $P2T_CurrentWindow_Position[3])
                FileWrite($P2T_FileHandle, @TAB & @TAB & @TAB & '<tr>' & @CRLF)
            ; ==========================================================================================================================================
                $P2T_X = 1
                ; For $x = 1 To $P2T_CurrentWindow_Position[2]
                For $x = $P2T_CurrentWindow_Position[0] To Number($P2T_CurrentWindow_Position[0] + $P2T_CurrentWindow_Position[2])
                    ProgressSet($ProgressPercent, $ProgressLabel1 & " / " & $ProgressLabel2, 'Row (Y): ' & StringFormat('%0' & $P2T_XYDigits & 'i', $P2T_Y) & ' / Column (X): ' & StringFormat('%0' & $P2T_XYDigits & 'i', $P2T_X))
                    $Temp_P2T_Color = '#' & Hex(PixelGetColor($x, $y, $WindowList[$P2T_CurrentWindow_ListPosition][1]) , 6)
                    FileWrite($P2T_FileHandle, @TAB & @TAB & @TAB & @TAB & '<td style="background-color: ' & $Temp_P2T_Color & ';"><span class="cellcontent">' & StringFormat('%0' & $P2T_XYDigits & 'i', $P2T_X) & 'X<br>' & StringFormat('%0' & $P2T_XYDigits & 'i', $P2T_Y) & 'Y</span><span class="hoverbox">Pixel Infomation<br><span class="hoverboxbody">Row (Y Position): ' & $P2T_Y & '<br>Column (X Position): ' & $P2T_X & '<br>Color Code: ' & $Temp_P2T_Color & '</span></span></td>' & @CRLF)
                    $ProgressProgress += 1
                    $ProgressPercent += $ProgressPercentPer
                    $ProgressLabel1 = $ProgressProgress & " of " & $ProgressTotalItems & " Pixrls(s)"
                    $ProgressLabel2 = Round($ProgressPercent, 0) & "% Completed."
                    $P2T_X += 1
                Next
            ; ==========================================================================================================================================
                FileWrite($P2T_FileHandle, @TAB & @TAB & @TAB & '</tr>' & @CRLF)
                $P2T_Y += 1
            Next
        ; ==============================================================================================================================================
            FileWrite($P2T_FileHandle, $P2T_Footer)
            FileClose($P2T_FileHandle)
            $ProgressLabel2 = "100% Completed."
            ProgressSet(100, $ProgressLabel1 & " / " & $ProgressLabel2, "Software Installation Complete")
            Sleep(5000)
            ProgressOff()
        ; ==============================================================================================================================================
            ShellExecute($P2T_FileName)
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; Pixels2Table Function
    ; ==================================================================================================================================================
    #Region ; Refresh_WindowList Function
    ; ==================================================================================================================================================
        Func Refresh_WindowList($RWL_TrayTip, $RWL_MsgContent = '') ; $RWL_TrayTip : 0 = Off / 1 = On
            If $RWL_MsgContent <> '' And StringRight($RWL_MsgContent, 1) <> ' ' Then $RWL_MsgContent &= ' '

            If $RWL_TrayTip = 1 Then TrayTip('Resize-A-Window...', $RWL_MsgContent & 'Refreshing window list.', 10, 2)
            $RWG_OpenWindow_List_Content = Get_WindowList()
            $RWG_OpenWindow_List_CurrentContent = ''

            For $a = 1 To $WindowList[0][0]
                If StringInStr($WindowList[$a][2], 'Active') Then $RWG_OpenWindow_List_CurrentContent = $WindowList[$a][0]
            Next
            If $RWG_OpenWindow_List_CurrentContent = '' Then $RWG_OpenWindow_List_CurrentContent = $WindowList[1][0]

            GUICtrlSetData($RWG_OpenWindow_List, '', '')
            GUICtrlSetData($RWG_OpenWindow_List, $RWG_OpenWindow_List_Content, $RWG_OpenWindow_List_CurrentContent)
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; Refresh_WindowList Function
    ; ==================================================================================================================================================
    #Region ; JB2_GetWindowControls Function
    ; ============================================================================================================================================================
    ; = Name.............: JB2_GetWindowControls                                                                                                                 =
    ; = Description......: Returns all or a specified subset of controls for a given window.                                                                     =
    ; = Required Includes: Array.au3 & WinAPI.au3                                                                                                                =
    ; = Syntax...........: JB2_GetWindowControls($GWC_WindowHandle[, $GWC_VisibleOnly = False[, $GWC_ControlTextContains = ''[, $GWC_GetSpecificClasses = '']]]) =
    ; = Parameters ......: $GWC_WindowHandle - The handle (hWnd) of the window to get the controls from.                                                         =
    ; =                    $GWC_VisibleOnly - Optional: True - Retrieves only visible controls or False - Retrieves all controls.                                =
    ; =                    $GWC_ControlTextContains - Optional: Text that a control must contain to be returned.                                                 =
    ; =                    $GWC_GetSpecificClasses - Optional: A specific class to return. (i.e. Button, ComboBox, Edit, Static, Etc.)                           =
    ; = Return values....: Success - Returns an array containing window control information.                                                                     =
    ; =                    Failure - 0                                                                                                                           =
    ; = Author...........: jdelaney                                                                                                                              =
    ; = Modified.........: Joshua Barnette, JBSquaredDesigns.com (2015-10-26)                                                                                    =
    ; = Retrieved From...: https://www.autoitscript.com/forum/topic/164226-get-all-windows-controls/                                                             =
    ; = Remarks..........: If only the window handle is given all window controls are returned.                                                                  =
    ; =                                                                                                                                                          =
    ; =                    The array returned is two-dimensional and is made up as follows:                                                                      =
    ; =                    $aArray[0][0] = Number of controls returned                                                                                           =
    ; =                    $aArray[1][0] = 1st control handle (hWnd)                                                                                             =
    ; =                    $aArray[1][1] = 1st control class                                                                                                     =
    ; =                    $aArray[1][2] = 1st control class instance                                                                                            =
    ; =                    $aArray[1][3] = 1st control ID                                                                                                        =
    ; =                    $aArray[1][4] = 1st control visibility (1 - Visible, 0 - Not Visible)                                                                 =
    ; =                    $aArray[1][5] = 1st control X position realtive to window                                                                             =
    ; =                    $aArray[1][6] = 1st control Y position realtive to window                                                                             =
    ; =                    $aArray[1][7] = 1st control width                                                                                                     =
    ; =                    $aArray[1][8] = 1st control height                                                                                                    =
    ; =                    $aArray[1][9] = 1st control text                                                                                                      =
    ; =                    ...                                                                                                                                   =
    ; =                    $aArray[n][0] = nth control handle (hWnd)                                                                                             =
    ; =                    $aArray[n][1] = nth control class                                                                                                     =
    ; =                    $aArray[n][2] = nth control class instance                                                                                            =
    ; =                    $aArray[n][3] = nth control ID                                                                                                        =
    ; =                    $aArray[n][4] = nth control visibility (1 - Visible, 0 - Not Visible)                                                                 =
    ; =                    $aArray[n][5] = nth control X position realtive to window                                                                             =
    ; =                    $aArray[n][6] = nth control Y position realtive to window                                                                             =
    ; =                    $aArray[n][7] = nth control width                                                                                                     =
    ; =                    $aArray[n][8] = nth control height                                                                                                    =
    ; =                    $aArray[n][9] = nth control text                                                                                                      =
    ; =                                                                                                                                                          =
    ; ============================================================================================================================================================
        Func JB2_GetWindowControls($GWC_WindowHandle, $GWC_VisibleOnly = 0, $GWC_ControlTextContains = '', $GWC_GetSpecificClass = '')
            If Not IsHWnd($GWC_WindowHandle) Then
                ; MsgBox(16, $Script_Name & ' Error', 'To retrieve all window controls, you must provide a valid window handle (hwnd).')
                Return 0
            EndIf

            $GWC_GetClassList = WinGetClassList($GWC_WindowHandle)

            ; Create array
            $GWC_ClassList = StringSplit($GWC_GetClassList, @CRLF, 2)

            ; Sort array
            _ArraySort($GWC_ClassList)
            _ArrayDelete($GWC_ClassList, 0)

            Dim $GWC_WindowControlList[UBound($GWC_ClassList) + 1][10]
            $GWC_WindowControlList[0][0] = UBound($GWC_ClassList) + 1

            ; Loop
            $GWC_CurrentClass = ''
            $GWC_CurrentClassCount = 1
            $GWC_TotalCounter = 1

            If StringLen($GWC_GetSpecificClass) > 0 Then
                For $sc = UBound($GWC_ClassList)-1 To 0 Step - 1
                    If $GWC_ClassList[$sc] <> $GWC_GetSpecificClass Then
                        _ArrayDelete($GWC_ClassList, $sc)
                    EndIf
                Next
            EndIf

            For $cl = 0 To UBound($GWC_ClassList) - 1
                If $GWC_ClassList[$cl] = $GWC_CurrentClass Then
                    $GWC_CurrentClassCount += 1
                Else
                    $GWC_CurrentClass = $GWC_ClassList[$cl]
                    $GWC_CurrentClassCount = 1
                EndIf

                $GWC_ControlHandle = ControlGetHandle($GWC_WindowHandle, "", "[CLASSNN:" & $GWC_CurrentClass & $GWC_CurrentClassCount & "]")
                $GWC_ControlText = StringRegExpReplace(ControlGetText($GWC_WindowHandle, "", $GWC_ControlHandle), "[\n\r]", "{@CRLF}")
                $GWC_ControlPosition = ControlGetPos($GWC_WindowHandle, "", $GWC_ControlHandle)
                $GWC_CurrentClassID = _WinAPI_GetDlgCtrlID($GWC_ControlHandle)
                $GWC_ControlVisibility = ControlCommand($GWC_WindowHandle, "", $GWC_ControlHandle, "IsVisible")
                If $GWC_VisibleOnly And Not $GWC_ControlVisibility Then
    ;               $GWC_TotalCounter += 1
                    ContinueLoop
                EndIf

                If StringLen($GWC_ControlTextContains) > 0 Then
                    If Not StringInStr($GWC_ControlText, $GWC_ControlTextContains) Then
    ;                   $GWC_TotalCounter += 1
                        ContinueLoop
                    EndIf
                EndIf

                    $GWC_WindowControlList[$GWC_TotalCounter][0] = $GWC_ControlHandle
                    $GWC_WindowControlList[$GWC_TotalCounter][1] = $GWC_ClassList[$cl]
                    $GWC_WindowControlList[$GWC_TotalCounter][2] = $GWC_CurrentClassCount
                    $GWC_WindowControlList[$GWC_TotalCounter][3] = $GWC_CurrentClassID
                    $GWC_WindowControlList[$GWC_TotalCounter][4] = $GWC_ControlVisibility
                If IsArray($GWC_ControlPosition) Then
                    $GWC_WindowControlList[$GWC_TotalCounter][5] = $GWC_ControlPosition[0]
                    $GWC_WindowControlList[$GWC_TotalCounter][6] = $GWC_ControlPosition[1]
                    $GWC_WindowControlList[$GWC_TotalCounter][7] = $GWC_ControlPosition[2]
                    $GWC_WindowControlList[$GWC_TotalCounter][8] = $GWC_ControlPosition[3]
                EndIf
                    $GWC_WindowControlList[$GWC_TotalCounter][9] = $GWC_ControlText

                If Not WinExists($GWC_WindowHandle) Then ExitLoop
                $GWC_TotalCounter += 1
            Next

            $GWC_WindowControlList = JB2_DeleteEmpty2DArrayRows($GWC_WindowControlList)
            $GWC_WindowControlList[0][0] = UBound($GWC_WindowControlList) - 1

            Return $GWC_WindowControlList
        EndFunc   ;==>GetAllWindowsControls
    ; ============================================================================================================================================================
    ; = Author...........: jdelaney                                                                                                                              =
    ; = Modified.........: Joshua Barnette, JBSquaredDesigns.com (2015-10-26)                                                                                    =
    ; = Retrieved From...: https://www.autoitscript.com/forum/topic/164226-get-all-windows-controls/                                                             =
    ; ============================================================================================================================================================
    #EndRegion ; JB2_GetWindowControls Function
    ; ==================================================================================================================================================
    #Region ; OnExit Functions
    ; ==================================================================================================================================================
        Func _OnExit()
            GUIDelete($RWG_GUI)
            Exit
        EndFunc
    ; ==================================================================================================================================================
        Func _OnExitWithMsg()
            GUIDelete($RWG_GUI)
            JB2_ThankYou(2000)
            Exit
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; OnExit Functions
    ; ==================================================================================================================================================
    #Region ; JB2_DeleteEmpty2DArrayRows Function
    ; ==================================================================================================================================================
        ; = Written By: WeaponX
        ; = Retrieved From : http://www.autoitscript.com/forum/topic/97637-remove-empty-rows-in-2d-array/
        ; = Modified By: Joshua Barnette, JBSquaredDesigns.com (2014-05-28)
        ; ==============================================================================================================================================
        Func JB2_DeleteEmpty2DArrayRows($JB2_DeleteEmpty2DArrayRows_Array)
            Local $JB2_DeleteEmpty2DArrayRows_Rows = Ubound($JB2_DeleteEmpty2DArrayRows_Array,1)
            Local $JB2_DeleteEmpty2DArrayRows_Cols = Ubound($JB2_DeleteEmpty2DArrayRows_Array,2)
            Local $JB2_DeleteEmpty2DArrayRows_Temp[$JB2_DeleteEmpty2DArrayRows_Rows][$JB2_DeleteEmpty2DArrayRows_Cols]
            Local $JB2_DeleteEmpty2DArrayRows_NotEmpty
            Local $JB2_DeleteEmpty2DArrayRows_Count = 0

            ;Loop through rows
            For $Y = 0 to $JB2_DeleteEmpty2DArrayRows_Rows - 1
                $JB2_DeleteEmpty2DArrayRows_NotEmpty = 0

                ;Loop through columns
                For $X = 0 to $JB2_DeleteEmpty2DArrayRows_Cols - 1

                    ;Copy all columns to temp array even if they are all empty
                    $JB2_DeleteEmpty2DArrayRows_Temp[$JB2_DeleteEmpty2DArrayRows_Count][$X] = $JB2_DeleteEmpty2DArrayRows_Array[$Y][$X]

                    ;If even one column contains data, make sure it doesn't get deleted
                    If $JB2_DeleteEmpty2DArrayRows_Array[$Y][$X] <> "" Then $JB2_DeleteEmpty2DArrayRows_NotEmpty = BitOr($JB2_DeleteEmpty2DArrayRows_NotEmpty, 1)
                Next

                ;If the row has any data, increment, else keep overwriting last row until it contains something
                If $JB2_DeleteEmpty2DArrayRows_NotEmpty Then $JB2_DeleteEmpty2DArrayRows_Count += 1
            Next

            Redim $JB2_DeleteEmpty2DArrayRows_Temp[$JB2_DeleteEmpty2DArrayRows_Count][$JB2_DeleteEmpty2DArrayRows_Cols]
            $JB2_DeleteEmpty2DArrayRows_Temp[0][0] = UBound($JB2_DeleteEmpty2DArrayRows_Temp) - 1
            Return $JB2_DeleteEmpty2DArrayRows_Temp
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; JB2_DeleteEmpty2DArrayRows Function
    ; ==================================================================================================================================================
    #Region ; JB2_SplashScreen & Supporting Functions
    ; ==================================================================================================================================================
        #Region ; JB2_SplashScreen
        ; ==============================================================================================================================================
            Func JB2_SplashScreen($JB2_SplashScreen_Status, $JB2_SplashScreen_Status_Message = "")
                If $JB2_SplashScreen_Status = "On" Then
                    Global $JB2_SplashScreen_Image = _ResourceGetAsImage("JB2_SplashScreen_Image", $RT_RCDATA)

                    ; Extract image width and height from PNG
                    Global $JB2_SplashScreen_Width = _GDIPlus_ImageGetWidth($JB2_SplashScreen_Image)
                    Global $JB2_SplashScreen_Height = _GDIPlus_ImageGetHeight($JB2_SplashScreen_Image)

                    ; Create layered window
                    Global $JB2_SplashScreen_GUI = GUICreate("Splash GUI", $JB2_SplashScreen_Width, $JB2_SplashScreen_Height, -1, -1, $WS_POPUP, $WS_EX_LAYERED, WinGetHandle(AutoItWinGetTitle()))
                    JB2_SplashScreen_SetBitmap($JB2_SplashScreen_GUI, $JB2_SplashScreen_Image, 0)
                    GUISetState(@SW_SHOW)

                    ;fade in png background
                    For $i = 0 To 255 Step 17
                        JB2_SplashScreen_SetBitmap($JB2_SplashScreen_GUI, $JB2_SplashScreen_Image, $i)
                        Sleep(50)
                    Next

                    ; create child MDI gui window to hold controls
                    Global $JB2_SplashScreen_GUI_Child = GUICreate("Splash GUI Child", $JB2_SplashScreen_Width-20, 17, 10, $JB2_SplashScreen_Height+5, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $JB2_SplashScreen_GUI)

                    ; child window transparency is required to accomplish the full effect, so $WS_EX_LAYERED above, and
                    ; I think the way this works is the transparent window color is based on the image you set here:
                    GUICtrlCreatePic("", 0, 0, $JB2_SplashScreen_Width-20, 17)
                    GUICtrlSetState(-1, $GUI_DISABLE)

                    Global $JB2_SplashScreen_GUI_Message = GUICtrlCreateLabel("", 0, 0, $JB2_SplashScreen_Width-20, 17)
                    GUICtrlSetFont(-1, 9, 800)
                    If StringInStr(@OSVersion, "WIN_XP") Then
                        GUICtrlSetColor(-1, 0x000066)
                        GUICtrlSetBKColor(-1, 0x000000)
                    Else
                        GUICtrlSetColor(-1, 0x000066)
                        GUICtrlSetBKColor(-1, 0xFFFFFF)
                    EndIf

                    GUISetState(@SW_SHOW)
                ElseIf $JB2_SplashScreen_Status = "Update" Then
                    GUICtrlSetData($JB2_SplashScreen_GUI_Message, $JB2_SplashScreen_Status_Message)
                ElseIf $JB2_SplashScreen_Status = "Off" Then
                    GUIDelete($JB2_SplashScreen_GUI_Child)

                    For $i = 255 To 0 Step -17
                        JB2_SplashScreen_SetBitmap($JB2_SplashScreen_GUI, $JB2_SplashScreen_Image, $i)
                        Sleep(50)
                    Next

                    GUIDelete($JB2_SplashScreen_GUI)

                    _WinAPI_DeleteObject($JB2_SplashScreen_Image)
                EndIf
            EndFunc
        ; ==============================================================================================================================================
        #EndRegion ; JB2_SplashScreen
        ; ==============================================================================================================================================
        #Region ; JB2_SplashScreen_SetBitmap
        ; ==============================================================================================================================================
            Func JB2_SplashScreen_SetBitmap($JB2_SplashScreen_hGUI, $JB2_SplashScreen_hImage, $JB2_SplashScreen_iOpacity)
                Local $JB2_SplashScreen_hScrDC, $JB2_SplashScreen_hMemDC, $JB2_SplashScreen_hBitmap, $JB2_SplashScreen_hOld, $JB2_SplashScreen_pSize, $JB2_SplashScreen_tSize, $JB2_SplashScreen_pSource, $JB2_SplashScreen_tSource, $JB2_SplashScreen_pBlend, $JB2_SplashScreen_tBlend

                $JB2_SplashScreen_hScrDC = _WinAPI_GetDC(0)
                $JB2_SplashScreen_hMemDC = _WinAPI_CreateCompatibleDC($JB2_SplashScreen_hScrDC)
                $JB2_SplashScreen_hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($JB2_SplashScreen_hImage)
                $JB2_SplashScreen_hOld = _WinAPI_SelectObject($JB2_SplashScreen_hMemDC, $JB2_SplashScreen_hBitmap)
                $JB2_SplashScreen_tSize = DllStructCreate($tagSIZE)
                $JB2_SplashScreen_pSize = DllStructGetPtr($JB2_SplashScreen_tSize)
                DllStructSetData($JB2_SplashScreen_tSize, "X", _GDIPlus_ImageGetWidth($JB2_SplashScreen_hImage))
                DllStructSetData($JB2_SplashScreen_tSize, "Y", _GDIPlus_ImageGetHeight($JB2_SplashScreen_hImage))
                $JB2_SplashScreen_tSource = DllStructCreate($tagPOINT)
                $JB2_SplashScreen_pSource = DllStructGetPtr($JB2_SplashScreen_tSource)
                $JB2_SplashScreen_tBlend = DllStructCreate($tagBLENDFUNCTION)
                $JB2_SplashScreen_pBlend = DllStructGetPtr($JB2_SplashScreen_tBlend)
                DllStructSetData($JB2_SplashScreen_tBlend, "Alpha", $JB2_SplashScreen_iOpacity)
                DllStructSetData($JB2_SplashScreen_tBlend, "Format", $JB2_SplashScreen_AC_SRC_ALPHA)
                _WinAPI_UpdateLayeredWindow($JB2_SplashScreen_hGUI, $JB2_SplashScreen_hScrDC, 0, $JB2_SplashScreen_pSize, $JB2_SplashScreen_hMemDC, $JB2_SplashScreen_pSource, 0, $JB2_SplashScreen_pBlend, $ULW_ALPHA)
                _WinAPI_ReleaseDC(0, $JB2_SplashScreen_hScrDC)
                _WinAPI_SelectObject($JB2_SplashScreen_hMemDC, $JB2_SplashScreen_hOld)
                _WinAPI_DeleteObject($JB2_SplashScreen_hBitmap)
                _WinAPI_DeleteDC($JB2_SplashScreen_hMemDC)
            EndFunc
        ; ==============================================================================================================================================
        #EndRegion ; JB2_SplashScreen_SetBitmap
    ; ==================================================================================================================================================
    #EndRegion ; JB2_SplashScreen & Supporting Functions
    ; ==================================================================================================================================================
    #Region ; JB2_ChangeLog Function
    ; ==================================================================================================================================================
        Func JB2_ChangeLog($JB2_ChangeLog_GUIWindow = '', $JB2_ChangeLog_Script_Title = '', $JB2_ChangeLog_Script_Version = '')
            $JB2_ChangeLog_ListView_0Width = 0
            $JB2_ChangeLog_ListView_1Width = 0
            If $JB2_ChangeLog_Script_Title = '' Then
                $JB2_ChangeLog_GUI_Title = 'Change Log'
            Else
                $JB2_ChangeLog_GUI_Title = $JB2_ChangeLog_Script_Title & ' Change Log'
            EndIf
            $JB2_ChangeLog_GUI = GUICreate($JB2_ChangeLog_GUI_Title, 600, 550, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX), -1, $JB2_ChangeLog_GUIWindow)
            $JB2_ChangeLog_AppLogo = GUICtrlCreatePic("", 15, 15, 256, 256)
            GUICtrlSetBkColor($JB2_ChangeLog_AppLogo, $GUI_BKCOLOR_TRANSPARENT)
            _ResourceSetImageToCtrl($JB2_ChangeLog_AppLogo, "JB2_SplashScreen_Image")
            GUICtrlCreateLabel($JB2_ChangeLog_Script_Title, 296, 25, 300, 25, $SS_CENTER)
            GUICtrlSetFont (-1, 14, 800)
            If $JB2_ChangeLog_Script_Version <> "" Then
                GUICtrlCreateLabel("Version: " & $JB2_ChangeLog_Script_Version, 296, 50, 300, 20, $SS_CENTER)
                GUICtrlSetFont (-1, 10, 600)
            EndIf
            GUICtrlCreateLabel("Copyright © 2014-" & @YEAR & ", JBSquaredDesigns.com." & @CRLF & "All Rights Reserved.", 296, 75, 300, 30, $SS_CENTER)
            $JB2_ChangeLog_Logo = GUICtrlCreatePic("", 382, 105, 128, 128)
                GUICtrlSetBkColor($JB2_ChangeLog_Logo, $GUI_BKCOLOR_TRANSPARENT)
                _ResourceSetImageToCtrl($JB2_ChangeLog_Logo, "JB2_128PNG_Logo")

            GUICtrlCreateGroup("", 10, 276, 580, 265)
                GUICtrlCreateLabel("Change Log", 20, 288, 560, 30, $SS_CENTER)
                    GUICtrlSetFont (-1, 14, 800)
                $JB2_ChangeLog_ListView = GUICtrlCreateListView("Date|Changes", 20, 316, 560, 215, BitOr($LVS_NOSORTHEADER, $LVS_SORTASCENDING), BitOr($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $WS_EX_CLIENTEDGE))
                GUICtrlSetBkColor($JB2_ChangeLog_ListView, $GUI_BKCOLOR_LV_ALTERNATE)
                For $li = 2 To $Script_ChangeLog[0][0]
                    If StringLen($Script_ChangeLog[$li][0]) > $JB2_ChangeLog_ListView_0Width Then $JB2_ChangeLog_ListView_0Width = StringLen($Script_ChangeLog[$li][0])
                    If StringLen($Script_ChangeLog[$li][1]) > $JB2_ChangeLog_ListView_1Width Then $JB2_ChangeLog_ListView_1Width = StringLen($Script_ChangeLog[$li][1])
                    Assign("$JB2_ChangeLog_ListView_Row" & Number($li - 1),GUICtrlCreateListViewItem($Script_ChangeLog[$li][0] & "|" & $Script_ChangeLog[$li][1], $JB2_ChangeLog_ListView))
                    GUICtrlSetBkColor(-1, 0xcccccc)
                Next
                _GUICtrlListView_SetColumnWidth($JB2_ChangeLog_ListView, 0, Number(($JB2_ChangeLog_ListView_0Width + 2) * 8)) ; 8px average width of characters at 8pt font.
                _GUICtrlListView_JustifyColumn($JB2_ChangeLog_ListView, 0, 2)
                _GUICtrlListView_SetColumnWidth($JB2_ChangeLog_ListView, 1, Number(($JB2_ChangeLog_ListView_1Width + 1) * 8)) ; 8px average width of characters at 8pt font.
                _GUICtrlListView_JustifyColumn($JB2_ChangeLog_ListView, 1)
            GUICtrlCreateGroup("", -99, -99, 1, 1)

            GUISetState()

            While 1
                $JB2_ChangeLog_iMsg = GUIGetMsg()
                Switch $JB2_ChangeLog_iMsg
                    Case $GUI_EVENT_CLOSE
                        GUIDelete($JB2_ChangeLog_GUI)
                        Return
                EndSwitch
            WEnd
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; JB2_ChangeLog Function
    ; ==================================================================================================================================================
    #Region ; JB2_ThankYou Function
    ; ==================================================================================================================================================
        Func JB2_ThankYou($JB2_ThankYou_SleepTimer, $JB2_ThankYou_GUIWindow = '', $JB2_ThankYou_Script_Title = '', $JB2_ThankYou_Script_Version = '')
            If $JB2_ThankYou_SleepTimer <> 0 Then
                $JB2_ThankYou_GUI = GUICreate("Thank You For Choosing:", 280, 280, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX), -1, $JB2_ThankYou_GUIWindow)
                $Logo = GUICtrlCreatePic("", 15, 15, 250, 250, $SS_SUNKEN)
                _ResourceSetImageToCtrl($Logo, "JB2_Logo")

                GUISetState()

                Sleep($JB2_ThankYou_SleepTimer)
            Else
                If $JB2_ThankYou_Script_Title = "" Then
                    $JB2_ThankYou_GUI_Title = "About"
                Else
                    $JB2_ThankYou_GUI_Title = "About " & $JB2_ThankYou_Script_Title
                EndIf
                $JB2_ThankYou_GUI = GUICreate($JB2_ThankYou_GUI_Title, 560, 280, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX), -1, $JB2_ThankYou_GUIWindow)
                $Logo = GUICtrlCreatePic("", 15, 15, 250, 250, $SS_SUNKEN)
                _ResourceSetImageToCtrl($Logo, "JB2_Logo")
                GUICtrlCreateLabel($JB2_ThankYou_Script_Title, 290, 25, 260, 25, $SS_CENTER)
                GUICtrlSetFont (-1, 14, 800)
                If $JB2_ThankYou_Script_Version <> "" Then
                    GUICtrlCreateLabel("Version: " & $JB2_ThankYou_Script_Version, 290, 50, 260, 20, $SS_CENTER)
                    GUICtrlSetFont (-1, 10, 600)
                EndIf
                GUICtrlCreateLabel("Copyright © 2014-" & @YEAR & ", JBSquaredDesigns.com." & @CRLF & "All Rights Reserved.", 290, 75, 260, 200, $SS_CENTER)

                GUISetState()

                While 1
                    $JB2_ThankYou_iMsg = GUIGetMsg()
                    Switch $JB2_ThankYou_iMsg
                        Case $GUI_EVENT_CLOSE
                            GUIDelete($JB2_ThankYou_GUI)
                            Return
                    EndSwitch
                WEnd
            EndIf
        EndFunc
    ; ==================================================================================================================================================
    #EndRegion ; JB2_ThankYou Function
; ======================================================================================================================================================
#EndRegion ; Necessary Supporting Functions
; ======================================================================================================================================================

 

TrayMenuIcons.au3

ShowMonitorInfo.au3

Edited by JoshuaBarnette

Share this post


Link to post
Share on other sites
ahmet

After you get handle of clicked control use _WinAPI_GetClassName() to check if you clicked ListView, and then try with _GUICtrlListView_HitTest() to get index of clicked item.

Share this post


Link to post
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

  • Similar Content

    • ur
      By ur
      An application is there which is created using vc++,mostly mfc.
       
      DOn't know the details completely.
       
      WHen I try to automate the control clicks for testing the UI.
      THe below control is not detected.
      As you can see, during UI operations I can click the elements one by one.
      But all the elements is selected as a whole set, when I use the Windowinfo tool.

       
      How to click this using AutoIT.?
       
      Please suggest.
    • nacerbaaziz
      By nacerbaaziz

      Hi dear
      This is the first include file I designed
      This work is especially directed to NVDA free screen reader users
      It contains a set of functions that enable you to control the program
      Such as forcing the program to read a custom text
      Force it to stop talking
      Find out if the program is running
      And show custom text in the Braille screen
      Available functions are
      _nvdaControllerClient_Load()
      to load the dll file
      _nvdaControllerClient_free()
      to UnLoad the dll file
      _nvdaControllerClient_SpeakText()
      to speak a custom text
      _nvdaControllerClient_brailleMessage()
      to show custom text in the Braille screen
      _nvdaControllerClient_cancelSpeech()
      to Force the NVDA  to stop talking
      _nvdaControllerClient_testIfRunning()
      to check if the NVDA is running
      important note :
      All of these functions depend on a nvdaControllerClient32.dll
      I've added it in the attachments, as well as a file for examples, and other files
      As the source and examples in other languages
      For those who wanted to download the free screen reader, this is the download link from the official website
      https://www.nvaccess.org/download/
      i hope you like this topic
      I hope you will try it and give me your opinions
      Thank you all members and administrators for their help
      now with the  Attachments
       
      nvdaControllerClient_UDF.zip
    • RHolmes
      By RHolmes
      I wrote a script a few months ago that was working at the time. When I tried it today it wouldn't retrieve any controls.  The application successfully launches, but I cannot figure out how to retrieve the control from the window that is launched. I'm on a windows 10 machine using AutoIt v3.3.14.2. The only thing I can think of that has changed is windows updates? Code is below, any help is greatly appreciated.    ; Notes: ; HandleError( handleToCheck, MsgToLogOnFailure, terminateAutoItOnFail ) : function that simply checks the handle and quits AutoIt if not present ; all of this works well FileChangeDir( $CLIENT_APPLICATION_DIR ); Run( "Client.exe" ) Local $hClient = WinWaitActive( $CLIENT_TITLE, "", 10 ) $terminateOnFail = 1 HandleError( $hClient, "LaunchClient::Error: Failed to launch client. Either timed-out or failed.", $terminateOnFail ) LogToFile( "Client launched, waiting for system to ready." ) Sleep( 5000 ) ; this part does not work ; $SYSTEM_INDICATOR is a global variable. I have tried these values: "SystemIndicatorWindow" (Text), "Qt5QWindowIcon101" (ClassNN), and ; "[CLASS:Qt5QWindowIcon; INSTANCE:101]" Local $hStatusIndicator = ControlGetHandle( $hClient, "", $SYSTEM_INDICATOR ) HandleError( $hStatusIndicator, "CheckStatus::Error: couldn't retrieve control: " & $SYSTEM_INDICATOR, $terminateOnFail ) This is what the spy reveals: 

       
      Edit: I just tried this code and it works for notepad++.
      FileChangeDir( "C:\Program Files\Notepad++\" ); Run( "notepad++.exe" ) Local $hNotePad = WinWaitActive( "new 1 - Notepad++", "", 10 ) If $hNotePad = 0 Or $hNotePad = -1 Then MsgBox( $MB_SYSTEMMODAL, "Error", "Error getting app handle." ) EndIf Sleep( 1000 ) Local $hNewFileBtn = ControlGetHandle( $hNotePad, "", "[CLASS:ToolbarWindow32; INSTANCE:1]" ) If $hNewFileBtn = 0 Or $hNewFileBtn = -1 Then MsgBox( $MB_SYSTEMMODAL, "Error", "Error getting button handle." ) EndIf MsgBox( $MB_SYSTEMMODAL, "Success", "Success." )  
    • rcmaehl
      By rcmaehl
      A UDF with Extended Functions for Window Management
       
      Notes:
      Fixes WinGetClassList's barbaric returning of a @LF separated string instead of an array.
       
      Potential Uses:
      Automating applications that change their controls' handles/classes on each launch (e.g. half of Cisco's programs)
       
      Functions:
      _WinGetClassList
      _WinGetClassNNList
      _WindowGetHandleList
      _WindowGetHandleListFromPos
       
      Download: 
      WindowEx.zip  (v0.4)
       
      Changelog:
      10/04/2016 (v0.4): _WinGetClassNNList Fixed : Not Returning an Index when using $2D_ARRAY _WinGetClassNNList Fixed : Not Properly returning $aArray[x][1] on Classes with instances > 9 when using $2D_ARRAY 10/03/2016 (v0.3): _WinGetClassList Added : Exactly the same as WinGetClassList but returns a more civilized Array _WinGetClassNNList Added : Returns Classes and their instances in either a 1D or 2D array depending on Flags _WindowGetHandleList Renamed: _WinGetHandleList SCRIPT BREAKING! _WindowGetHandleListFromPos Renamed: _WinGetHandleListFromPos SCRIPT BREAKING! 10/01/2016 (v0.2): WindowsExConstants.au3 Added : Flags in _WindowGetHandleListFromPos _WindowGetHandleListFromPos Removed: ConsoleWrite left in during debug _WindowGetHandleListFromPos Added : Flag for if part of a Control is at $X, $Y return it as well. 10/01/2016 (v0.1): _WindowGetHandleList Added : Retrieves the handles of classes from a window. _WindowGetHandleListFromPos Added : Retrieves the handles of classes at a specific position from a window. Known and Reported Bugs:
      None reported To Do:
      To Be Decided. Opinions welcome! Upcoming Changes:
      To Be Decided.
    • kcvinu
      By kcvinu
      Hi all,
      I am playing with _GUICtrlButton_Create function. How can i change this button's (or the entire form's) font ?. The in-built GUICtrlSetFont function is not working even when i convert the control handle to control ID with _WinAPI_GetDlgCtrlID ( ) function.  Do i need to use CreateFont api finction and send WM_SETFONT message ? Or is there any other easy and safe ways to do this ?. Thanks in advance.
      Note : This window is created by CreateWindowEx function, not by GUICreate function. 
×