Что нового

Почему скрипт зависает ?

vaf

Новичок
Сообщения
174
Репутация
2
Добрый день, уважаемые коллеги. Запутался в 3-х соснах. Не могу понять почему скрипт зависает после 22й строки, т.е. он рисует окно
$hDesc = GUICreate("Выберите норматив на выполнение",370,50)
а кнопки уже не выводит при этом скрипт зависает
Смысл скрипта - по клике по кнопке "Начать обслуживание" должно появиться окно с выбором

Код:
#include <MouseOnEvent.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("TrayIconHide", 0) ; Убираем иконку
Global $Timer = False

_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "_MOUSE_CLICK");    - событие на левую кнопку мыши

While 1
    Sleep (1000)
WEnd

Func _MOUSE_CLICK()
    ;Sleep (1000)
    $aPos = MouseGetPos()
    MouseClick ('left', $aPos[0], $aPos[1], 1)
    $ControlText    = ControlGetText("[ACTIVE]", "", "")
    $ControlGet        = ControlGetFocus (WinGetTitle ("[ACTIVE]"), '')


    If $ControlText = 'Начать обслуживание' And $Timer = False Then
        Global $Timer = True
        $hDesc = GUICreate("Выберите норматив на выполнение",370,50)
        $Button_10 = GUICtrlCreateButton("10 мин", 25, 15, 70)
        $Button_15 = GUICtrlCreateButton("15 мин", 105, 15, 70)
        $Button_30 = GUICtrlCreateButton("30 мин", 185, 15, 70)
        $Button_50 = GUICtrlCreateButton("50 мин", 265, 15, 70)
        GUISetState()

        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    GUIDelete()
                    ExitLoop
                Case $Button_10
                    Timer(1)
                    ExitLoop
                Case $Button_15
                    Timer(14)
                    ExitLoop
                Case $Button_30
                    Timer(29)
                    ExitLoop
                Case $Button_50
                    Timer(49)
                    ExitLoop
            EndSwitch
        WEnd
    EndIf

    ToolTip($ControlText & ' ' & $ControlGet)
EndFunc

Func Timer($time)
    GUIDelete() ; Отключаем GUI
    $sec = 1000 * 60
    Sleep ($time * 1000 * 60)
    SplashTextOn ("Время талона заканчивается через 1 мин", "Не забудьте закрыть обращение")
    MsgBox (4096, "Время талона заканчивается через 1 мин", "Не забудьте закрыть обращение")
    SplashOff()
EndFunc
 
Последнее редактирование:

Webarion

Осваивающий
Сообщения
135
Репутация
22
У вас при клике выполняется функция, внутри которой MouseClick, это зацикливает на ту же самую функцию. А также внутри функции While 1... WEnd создаёт подвисание. Здесь нужен другой способ. Попробуйте этот:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinApi.au3>


Opt("TrayIconHide", 0) ; Убираем иконку
Global $Timer = False

While 1
    Local $iIsPressed = __IsPresssed(1)
    Local $iTrig = __RepeatTrigger($iIsPressed, 'igMouseDown')
    If $iIsPressed Then
        If $iTrig Then ContinueLoop
        $aHoverInfo = __HoverInfo()
        If UBound($aHoverInfo) Then
            If $aHoverInfo[4] = 'Начать обслуживание' Then CreateGUI()
        EndIf
    EndIf
    Sleep(10)
WEnd


Func CreateGUI()

    $aPos = MouseGetPos()
    MouseClick('left', $aPos[0], $aPos[1], 1)

    If $Timer = False Then
        Global $Timer = True
        $hDesc = GUICreate("Выберите норматив на выполнение", 370, 50)
        $Button_10 = GUICtrlCreateButton("10 мин", 25, 15, 70)
        $Button_15 = GUICtrlCreateButton("15 мин", 105, 15, 70)
        $Button_30 = GUICtrlCreateButton("30 мин", 185, 15, 70)
        $Button_50 = GUICtrlCreateButton("50 мин", 265, 15, 70)
        GUISetState(@SW_SHOW, $hDesc)

        While 1
            Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                    GUIDelete()
                    ExitLoop
                Case $Button_10
                    Timer(1)
                    ExitLoop
                Case $Button_15
                    Timer(14)
                    ExitLoop
                Case $Button_30
                    Timer(29)
                    ExitLoop
                Case $Button_50
                    Timer(49)
                    ExitLoop
            EndSwitch
            Sleep(100)
        WEnd
    EndIf

;~     $ControlGet = ControlGetFocus(WinGetTitle("[ACTIVE]"), '')
;~     ToolTip($ControlText & ' ' & $ControlGet)
EndFunc   ;==>CreateGUI

Func Timer($time)
    GUIDelete() ; Отключаем GUI
    $sec = 1000 * 60
    Sleep($time * 1000 * 60)
    SplashTextOn("Время талона заканчивается через 1 мин", "Не забудьте закрыть обращение")
    MsgBox(4096, "Время талона заканчивается через 1 мин", "Не забудьте закрыть обращение")
    SplashOff()
EndFunc   ;==>Timer



Func __IsPresssed($sHexKey)
    Local $aReturn = DllCall('user32.dll', 'short', 'GetAsyncKeyState', 'int', '0x' & $sHexKey)
    If @error Then Return SetError(@error, @extended, False)
    If $aReturn[0] = 1 Or BitAND($aReturn[0], 0x8000) Then Return 1
    Return 0
EndFunc   ;==>__IsPresssed

Func __RepeatTrigger($sVar, $trigName)
    Local $sNewTrig = 'gStopTrigger_' & $trigName
    If Not IsDeclared($sNewTrig) Then Assign($sNewTrig, 0, 2)
    If Eval($sNewTrig) = $sVar Then Return 1
    Local $a = Eval($sNewTrig)
    Assign($sNewTrig, $sVar, 2)
    Return 0
EndFunc   ;==>__RepeatTrigger

Func __HoverInfo()
    Local $tPoint, $hForm, $hControl, $iID, $sTitleForm, $ControlText
    $tPoint = _WinAPI_GetMousePos()
    $hControl = _WinAPI_WindowFromPoint($tPoint)
    $hForm = _WinAPI_GetAncestor($hControl, 2)
    If $hForm = $hControl Then $hControl = 0
    $iID = _WinAPI_GetDlgCtrlID($hControl)
    $sTitleForm = _WinAPI_GetWindowText($hForm)
    $ControlText = _WinAPI_GetWindowText($hControl)
    Local $aRet[] = [$sTitleForm, $hForm, $hControl, $iID, $ControlText]
    Return $aRet
EndFunc   ;==>__HoverInfo
 
Автор
V

vaf

Новичок
Сообщения
174
Репутация
2
Спасибо - это помогло
 
Верх