Что нового

Вывод меняющихся процентов (Бег процентов)

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Добрый день всем. Пробую выводить бегущие проценты, но почему-то выводиться цифра и тут же замирает. У других видел вроде бы тоже самое и проценты бегут. По идее этого достаточно
Код:
$iProcC = Number(StringRegExpReplace(WinGetTitle($hTitleProc), '[^\d]', '\1'))
GUICtrlSetData($Sekk, $iProcC)


Привожу сразу весь кусок тренировачного кода, чтоб можно было попробовать
Код:
#pragma compile(AutoItExecuteAllowed, true)
#RequireAdmin
#include <Clipboard.au3>
#include <Constants.au3>
#include <Date.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <Timers.au3>
#include <StaticConstants.au3>
#Include <ScreenCapture.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <WinAPIProc.au3>




Global $sIniFile = @ScriptDir & '\Setting.ini'

Global $timer, $Secs, $Mins, $Hour, $Time, $sTime, $TimeInf, $sPS, $sPD
Global $iPid, $iTM, $hTitleProc, $iProcWinH, $iProcWinW
Global $Counter = IniRead("Setting.ini","Statistika","Count","")
Global $sPathSC = @ScriptDir & '\screen' & $Counter+1 & '.bmp'
Global $ahWin, $ClassObj


$hGui = GUICreate('Секундомер', 700, 680, -1, -1, -1, $WS_EX_TOPMOST)
Local $btStart = GUICtrlCreateButton('Старт', 392, 8, 75, 25)
Local $sPathSS = GUICtrlCreateInput('', 8, 96, 325, 21)
Local $sPathDD = GUICtrlCreateInput('', 8, 128, 325, 21)
Local $sPathS = GUICtrlCreateButton('Откуда', 392, 96, 75, 25)
Local $sPathD = GUICtrlCreateButton('Куда', 392, 128, 75, 25)
Local $btClear = GUICtrlCreateButton('Очистить', 392, 630, 75, 25)

$LabelPic1 = GUICtrlCreateLabel('', 8, 370, 330, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)
$LabelPic2 = GUICtrlCreateLabel('', 338, 370, 330, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)
$LabelPic3 = GUICtrlCreateLabel('', 8, 600, 330, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)
$LabelPic4 = GUICtrlCreateLabel('', 338, 600, 330, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)
$Sekk =  GUICtrlCreateLabel('', 8, 640, 75, 25, $SS_CENTERIMAGE + $SS_CENTER, $WS_EX_STATICEDGE)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE

            ProcessClose($iPid)
            Exit
        Case $sPathS
            GUICtrlSetData($sPathSS, '')
            $sPS = FileSelectFolder('Выбор копируемой папки', '', 0, '', $hGui)
            If Not @error Then GUICtrlSetData($sPathSS, $sPS)
        Case $sPathD
            GUICtrlSetData($sPathDD, '')
            $sPD = FileSelectFolder('Выбор папки назначения', '', 0, '', $hGui)
            If Not @error Then GUICtrlSetData($sPathDD, $sPD)
         Case $btStart

           _COPY()
           Sleep(1000)
            _SCREEN()

        Case $btClear
            GUICtrlSetData($sPathSS, '')
            GUICtrlSetData($sPathDD, '')
            _Clear()
EndSwitch
WEnd

  Func _Clear()
Local $aRS = IniReadSection("Setting.ini", "Путь")
If Not @error Then
    For $i = 1 To $aRS[0][0]
        $aRS[$i][1] = ''
    Next
    IniWriteSection("Setting.ini", "Путь", $aRS)
 EndIf
 Local $LCC = IniReadSection("Setting.ini","Statistika")
If Not @error Then
    For $j = 1 To $LCC[0][0]
        $LCC[$j][1] = ''
    IniWrite("Setting.ini","Statistika", $LCC[$j][0], '')
    Next
 EndIf
Local $IMG = IniReadSection("Setting.ini","ПутьСкрин")
 If Not @error Then
    For $k = 1 To $IMG[0][0]
        $IMG[$k][1] = ''
    FileDelete(IniRead("Setting.ini","ПутьСкрин", $IMG[$k][0], ''))
    IniWrite("Setting.ini","ПутьСкрин", $IMG[$k][0], '')
    Next
EndIf
 EndFunc

 Func _SCREEN()
    AdlibRegister("$iPid", 100)
If Not WinExists("[class:OperationStatusWindow]") Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
 Else
    $hWnd = WinGetHandle("[CLASS:OperationStatusWindow]")

$iProcC = Number(StringRegExpReplace(WinGetTitle($hTitleProc), '[^\d]', '\1'))

GUICtrlSetData($Sekk, $iProcC)

       If $iProcC > 25 Then

Send("!{PRINTSCREEN}")

    _ClipBoard_Open(0)
    $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP)
    _ClipBoard_Close()
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    _GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\screen.bmp")
    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_Shutdown()
   Dim $Screen = @ScriptDir & "\screen.bmp"

    ShellExecute($Screen)
    EndIf
  EndIf
EndFunc   ;==>_SCREEN


Func _COPY()
                         FileDelete('copy.txt')
            Local $aPosP = WinGetPos($hGui)
            WinMove($hGui, '', $aPosP[0], $aPosP[1], $aPosP[2], $aPosP[3] - $iProcWinH)
            If Not ProcessExists($iPid) Then
                If FileExists($sPS) And FileExists($sPD) Then
                    GUICtrlSetData($TimeInf, '00:00:00')
                    FileWrite('copy.txt', "$Shell = ObjCreate('Shell.Application')" & @CRLF & "$Shell.NameSpace('" & $sPD & "').CopyHere('" & $sPS & "', 16)")
                    $timer = TimerInit()
                    $iTM = _Timer_SetTimer($hGui, 10, '_TIMER')
                    $iPid = Run(@AutoItExe & ' /AutoIt3ExecuteScript copy.txt')
                    If ProcessExists($iPid) Then
                        While 1
                            $ahWin = _WinAPI_EnumProcessWindows($iPid)
                            If Not @error Then
                                If Not StringInStr($ahWin[1][1], 'Autoit') Then
                                    $hTitleProc = $ahWin[1][0]
                                    $ClassObj = $ahWin[1][1]
                                EndIf
                                ExitLoop
                            EndIf
                        WEnd
                    EndIf
                EndIf
             EndIf
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
почему-то выводиться цифра и тут же замирает
Мистика...
Если выводить значение переменной $iProcC в консоль, что будет видно? если выведет один раз, значит цикл не повторяется, если много раз выводит одно и то же, то нужно смотреть в сторону источника цифры (заголовок окна).
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Если выводить значение переменной $iProcC в консоль, что будет видно?
Один раз. Выводит тоже самое, что и в окошко.
За заголовок пробовал брать различные переменные. На всякий случай делал задержку перед стартом процентов.
Просьба посмотреть мой пример в спойлере. Правда он без вывода в консоль.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Нужно цикл запускать чтобы обновлялись данные.

Просьба посмотреть мой пример в спойлере.
Мне сложно в нём разобраться, там много нелогичного кода...
В целом могу сказать, функция _SCREEN() вызывается один раз, поэтому не вижу причины почему данные должны обновляться.
И вообще меня поразила строчка:
Код:
AdlibRegister("$iPid", 100)

Это что за зверь такой?
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Это что за зверь такой?
Пытаюсь отловить процесс копирования и сделать скрин в конце. Когда функция _SCREEEN() отдельно от всего кода, тогда она спокойно делает скрин на 99%, ато и на 100%. Когда вставляю в код, то срабатывает приблизительно в таком виде, но скрин делает на тех процентах, которые отобразились в
Код:
GUICtrlSetData($Sekk, $iProcC)

Собственно потому и решил её вывести, что захотел сравнить результаты. Получилось, что действительно срабатывает в тот момент, когда фиксируются проценты копирования. Оказалось, что проценты дальше не бегут. Видимо с этим и связано раннее срабатывание функции _SCREEN().
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пытаюсь отловить процесс копирования
Ты в справку заглядывал? Это функция-таймер для повторения процедуры. Первый параметр этой функции должно быть имя функции.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Первый параметр этой функции должно быть имя функции.
Так в функции копирования она объявляется
Код:
$iPid = Run(@AutoItExe & ' /AutoIt3ExecuteScript copy.txt')

Это 137 строка
Если закоментировать
Код:
AdlibRegister("$iPid", 100)
то ничего не меняется. Пробовал сюда другие имена подставлять. Изначально вообще без неё пробовал, а потом в другом месте подставлял.
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пробовал сюда другие имена подставлять
Какие имена, там нужно ставить имя функции! Которая будет запускаться каждые № миллисекунд (второй параметр).
Что ты ожидаешь от такого использования? что скрипт copy.txt будет повторно запускаться? :smile:
Я серьёзно рекомендую тебе попытаться составить ТЗ и выставить в Стол заказов.
Если же сам хочешь учиться, то начни открывать справку по каждой функции.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Если же сам хочешь учиться, то начни открывать справку по каждой функции.
Открываю и читаю. Что-то понимаю сразу, что-то до сих пор понять не могу. Особенно синтаксис. И самое грустное, что нет на мой взгляд толкового учебника по теме.
Что ты ожидаешь от такого использования? что скрипт copy.txt будет повторно запускаться?
Нет, ожидаю, что он будет мониторится, идет или нет, бегут проценты или нет. Ведь по идее
Код:
AdlibRegister
не только периодически вызывает функцию, но и мониторит изменения процессов.
Я серьёзно рекомендую тебе попытаться составить ТЗ и выставить в Стол заказов.
Уже будет не серьезно, потому что простой заказ на вариацию я уже делал. Далековато зашел, для повторного заказа. Некоторые вещи и у самого получаются. А справка для меня почему-то тяжело дается. В одной из тем мне человек более доступно чем в справке пояснил вопрос по синтаксису. А мое ТЗ может дорого мне обойтись. Да и мне стало не так актуально. На той неделе ещё торопился. Сейчас время упущено.
А то, что задаю много вопросов, так на мой взгляд, самый глупый вопрос - незаданный. Как говорил дедушка Ленин: количество рано или поздно перейдет в качество.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
мониторит изменения процессов
Где это написано?
В справке написано так:
Каждые 250 мс (или указанное в параметре time мс) вызывается указанная "function" (функция)

нет на мой взгляд толкового учебника по теме
Всё есть, нужно "упорство и желание", а не "сроки и результат" (на данном этапе обучения).
Я же как то учился, при чём с полного нуля и в те времена когда AutoIt был не так популярен и развит.

Как говорил дедушка Ленин: количество рано или поздно перейдет в качество.
Я бы с ним поспорил, ну да ладно, не по теме это :smile:.
 
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
И там же написано, что можно проверить, вызвалась она или нет
Код:
[URL='https://autoit-script.ru/docs/keywords/if.htm']If[/URL] [URL='https://autoit-script.ru/docs/functions/winactive.htm']WinActive[/URL]("Error") [URL='https://autoit-script.ru/docs/keywords/ifelseendif.htm']Then[/URL] ; проверяем не появилось ли активное окно с названием Error
Возможно не совсем корректно выразился. Помогает мониторить изменения.
Всё есть, нужно "упорство и желание", а не "сроки и результат" (на данном этапе обучения).
Начиналось точно не с обучения. То, что нужно было первоначально давно получил. Но язык понравился, вот и решил подучиться и развить идею. Поэтому и сказал, что сроки уже не имеют значения.
Я бы с ним поспорил, ну да ладно, не по теме это
Лучше не стоит. Его давно нет. А те, кто думает также, в том числе и учителя да психологи, легко докажут его правоту. Ведь речь не идет о величине качества и длительности. Все условно.
 
Верх