Что нового

Как узнать состояние checkbox из другого скрипта ?

mikka

Новичок
Сообщения
3
Репутация
0
Добрый день народ, помогите пожалуйста.
Не могу понять, как узнать состояние checkbox (создан в отдельном скрипте) из другого скрипта ?

Есть вот такое окно, нужно из другого скрипта определять состояние 3-х чекбоксов.

Код:
Func Example($sOwner = 0, $sOwner2 = 0)
        ;MsgBox($MB_SYSTEMMODAL, "Title", $sOwner, 10)
        ; Create a GUI with various controls.
        $childPos = WinGetPos($sOwner)
        
        ;MsgBox($MB_SYSTEMMODAL, "222", $childPos&, 10)
        
        Local $hGUI = GUICreate("__SCAD_01_HKscript", 78, 16, $childPos[0]+100, $childPos[1]+7, 0x80000000, 0x00000080)
        Local $idCBx = GUICtrlCreateCheckbox("X", 1, 1, 26, 13)
        Local $idCBy = GUICtrlCreateCheckbox("Y", 27, 1, 26, 13)
        Local $idCBz = GUICtrlCreateCheckbox("Z", 53, 1, 26, 13)
        
        Local $aWindow_Size = WinGetPos($hGUI)
        ;ConsoleWrite('Window Width  = ' & $aWindow_Size[2] & @CRLF)
        ;ConsoleWrite('Window Height = ' & $aWindow_Size[3] & @CRLF)
        Local $aWindowClientArea_Size = WinGetClientSize($hGUI)
        ;ConsoleWrite('Window Client Area Width  = ' & $aWindowClientArea_Size[0] & @CRLF)
        ;ConsoleWrite('Window Client Area Height = ' & $aWindowClientArea_Size[1] & @CRLF)

        ; Display the GUI.
        GUISetState(@SW_HIDE, $hGUI)
        
        WinSetOnTop ( $hGUI, "", 1 )

        ; Loop until the user exits.
        While 1
            if Not WinExists ($sOwner) Then ExitLoop
            If @error Then ExitLoop
            Sleep(300)
        WEnd

        ; Delete the previous GUI and all controls.
        GUIDelete($hGUI)
EndFunc
 

Norm

Продвинутый
Сообщения
279
Репутация
74
Нажмите F1
Код:
HotKeySet("{F1}", "_St_ChBx")
Global $idCBx, $idCBy, $idCBz
Example()

Func Example($sOwner = 0)
        If Not IsHWnd($sOwner) Then
            $sOwner = WinGetHandle("[ACTIVE]")
        EndIf
        Local $childPos = WinGetPos($sOwner)
        Local $hGUI = GUICreate("__SCAD_01_HKscript", 78, 16, $childPos[0]+100, $childPos[1]+7, 0x80000000, 0x00000080)
        $idCBx = GUICtrlCreateCheckbox("X", 1, 1, 26, 13)
        $idCBy = GUICtrlCreateCheckbox("Y", 27, 1, 26, 13)
        $idCBz = GUICtrlCreateCheckbox("Z", 53, 1, 26, 13)
        Local $aWindow_Size = WinGetPos($hGUI)
        Local $aWindowClientArea_Size = WinGetClientSize($hGUI)
        GUISetState(@SW_SHOW, $hGUI)
        WinSetOnTop ( $hGUI, "", 1 )
        While 1
            if Not WinExists ($sOwner) Then ExitLoop
            If @error Then ExitLoop
            Sleep(300)
        WEnd
        GUIDelete($hGUI)
EndFunc

Func _St_ChBx()
    ConsoleWrite("Checkbox idCBx = "& BitAND(GUICtrlRead($idCBx),1) & @CRLF)
    ConsoleWrite("Checkbox idCBy = "& BitAND(GUICtrlRead($idCBy),1) & @CRLF)
    ConsoleWrite("Checkbox idCBz = "& BitAND(GUICtrlRead($idCBz),1) & @CRLF & @CRLF)
EndFunc
 
Автор
M

mikka

Новичок
Сообщения
3
Репутация
0
Добрый день, спасибо. А возможно сделать это из другого скрипта?

Код:
; ищем вспомогательное окно
            $hWndSW = WinGetHandle ("__SCAD_01_HKscript")
            if @error Then 
                ; если окна нет, то запускаем скрипт заного
                $pid = Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & @ScriptDir & '\__SCAD_01.au3" ' & $hWnd2 & ' ' & $hWnd, '')
                Sleep (100)
                ; получаем дескриптор окна
                $hWndSW = WinGetHandle ("__SCAD_01_HKscript")
            EndIf
            
            $aResult = _getControlList ('Button', $hWndSW)
            If IsArray($aResult) Then 
                ; массив aResult  содержит hwnd для всех контролов из формы
                ; как узнать, нажат ли checkbox или нет по его hwnd 
            EndIf


Func _getControlList
Код:
Func _getControlList ($sClass='', $sOwner = 0)
; функция возвращает массив, с данными о 
; контролах формы
    dim $aData, $i, $j, $aTemp, $hWin
    Dim $aResult[1][5]
    
    $aData = _WinAPI_EnumChildWindows($sOwner)
    If Not IsArray($aData) Then 
        Return 0
        Exit
    EndIf
    
    For $i = 1 To $aData[0][0]
        If $aData[$i][1] == $sClass Then
            ;_ArrayDisplay($aData)
            $j += 1
            ReDim $aResult[$j + 1][5]
            $aResult[$j][0] = $aData[$i][1]
            $aResult[$j][1] = $aData[$i][0]
            $aResult[$j][2] = _WinAPI_GetDlgCtrlID($aData[$i][0])
            $aTemp = ControlGetPos($hWin, '', $aData[$i][0])
            If Not @error Then
                For $q = 0 To 1
                    $aResult[$j][$q + 3] = $aTemp[$q]
                Next
            EndIf
        EndIf
    Next
            ;$aResult[0][0] = 'Class name'
            ;$aResult[0][1] = 'Handle'
            ;$aResult[0][2] = 'ID'
            ;$aResult[0][3] = 'X'
            ;$aResult[0][4] = 'Y'

    _ArraySort($aResult, 0, 1, 0, 2) ; 2 - по ID, 3 - по X, 4 по Y
    ;_ArrayDisplay($aResult)
    Return $aResult
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Код:
If IsArray($aResult) Then
  For $c = 1 To UBound($aResult) - 1
    $Text = ControlGetText($hWndSW, "", $aResult[$c][1])
    If ControlCommand($hWndSW, "", $aResult[$c][1], "IsChecked") Then MsgBox(0, "", $Text & " IsChecked")
  Next
EndIf
 
Автор
M

mikka

Новичок
Сообщения
3
Репутация
0
Спасибо большое, все работает!!!
 
Верх