Помощь - Поиск - Пользователи - Календарь
Полная версия: Поиск пути к дочернему окну(скрипт)
UoKit.com Форумы > Кликер > UO Pilot
DarkMaster
Скрипт предназначен для автоматической генерации кода поиска дочернего окна.
Для работы требуется версия не ниже 2.33

v. 1.0
Оно работает!
v. 1.1
Ввод хендлов через Ctrl+A.
Убраны возможные проблемы со свернутым окном лога.
Сделано цивильное отображение результата скрипта.
Итоговый хендл теперь содержится в переменной #childHandle, а не в #var.
v. 1.2
Теперь генерируется чистый код без паразитных кавычек. Спасибо Zeleax за идею.
Сильно облегчен алгоритм генерирования кода.
v. 1.3
Добавлена генерация поиска родительского окна по имени.
Сделано агрессивное вытаскивания пилота на передний план, чтобы при нажатии Ctrl+A был активен именно пилот.
v. 1.4 by Cirus
Добавлено получение кода для lua.
Добавлено workwindow (childHandle) и set workwindow #childHandle.

Скрипт версия 1.4
Код
set #lua 1    // если 1- код для lua, 0 - код для языка пилота


set linedelay 0
// Версия скрипта 1.4.
// Данный скрипт предназначен для автоматической
// генерации кода поиска дочернего окна.
// Автор DarkMaster.
// Вопросы и предложения оставляйте на форуме
// в специальной теме по данному скрипту.
// http://forum.uokit.com/index.php?showtopic=26742
set #handlePilot findwindow ()
log #handlePilot
log close
log clear
log open

set #logSizeX 300
set #logSizeY 200

set #handleLog 0
while #handleLog = 0
    set #handleLog findwindow (Log Window)
end_while
set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set windowpos #x #y #logSizeX #logSizeY #handleLog
log mode compact

set workwindow 0
showwindow #handlePilot
log Укажите родительское окно (Ctrl+A)
while workwindow = 0
    wait 100
    showwindow #handlePilot
end_while
set #startHandle workwindow

log Теперь укажите дочернее окно (Ctrl+A)
while workwindow = #startHandle
    wait 100
    showwindow #handlePilot
end_while
set #targetHandle workwindow
log clear

// Получаем имя родительского окна.
set $ownerTitle getwindowtext (#startHandle)
if  $ownerTitle != "" // Генерируем только если у родительского окна есть имя.
    set $findwindow "findwindow"
    if  #lua = 1
        set %quote [1] chr(34)
        set $if "if ownerHandle then"
        log --lua
        log local ownerHandle, tmp, childHandle = $findwindow ([[$ownerTitle]])
        log $if
    else
        log set #ownerHandle $findwindow ($ownerTitle)
    end_if
end_if


// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #targetHandle
set #i 1
set #n 1
while #startHandle <> %middleOwnerHandle [ #i ]
    set #i #i + 1
    set #arrToIntTmp %middleOwnerHandle [ #n ]
    set %middleOwnerHandle [ #i ] getwindow (#arrToIntTmp owner)
    set #n #n + 1
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set $beginString "set #tmp getwindo"
set $middleString "w (#tmp"
set $w "w"
set #var getwindow (#startHandle child)

if #lua = 1
    log     tmp = getwindo$w (ownerHandle[1][1], "child")
else
    log set #tmp getwindo$w (#ownerHandle child)
end_if

set #i #sizeMiddleOwnerHandle - 1
set $direction ""
while #var <> #targetHandle
    if  $direction <> ""
        if  #lua = 1
            set $beginString "tmp = getwindo"
            set $middleString "w (tmp,"
            log     $beginString$middleString %quote [1]$direction%quote [1])
       else
            log $beginString$middleString $direction)
        end_if
    end_if

    // Выход за пределы массива
    if  #i > #sizeMiddleOwnerHandle
        log Ошибка!
        log Пути от родительского окна
        log к дочернему не существует.
        log Возможные причины данной ошибки:
        log 1) Вы спутали местами дочернее и родительское окно.
        log 2) Вы промазали и нажали Ctrl+A по другому окну.
        log 3) Дочернее окно не принадлежит родительскому.
    end_if
    // Текущее окно совпало с одним из чайлдов,
    // найденных в начале скрипта
    if  %middleOwnerHandle [ #i ] = #var
        set #var getwindow (#var child)
        set $direction child
        set #i #i - 1
    else
        set #var getwindow (#var next)
        set $direction next
    end_if
end_while


if  #lua = 1
    set $middleString "w (tmp,"
    set $workwin "workwindow (childHandle)"
    log     childHandle = getwindo$middleString %quote [1]$direction%quote [1])
    log     $workwin
    log end
else
    set $workwin "set workwindow #childHandle"
    log set #childHandle getwindo$middleString $direction)
    log $workwin
end_if


set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set #logSizeX 450
set #logSizeY screenheight / 8 * 5

set windowpos #x #y #logSizeX #logSizeY #handleLog

set $tmp "http:/"
set $tmp2 "/forum.uokit.com/index.php?showtopic=26742"
log
log  Автор скрипта DarkMaster.
log  Ветка на форуме: $tmp$tmp2
stop_script

Скрипт версия 1.3
Код
set linedelay 0
// Версия скрипта 1.3.
// Данный скрипт предназначен для автоматической
// генерации кода поиска дочернего окна.
// Автор DarkMaster.
// Вопросы и предложения оставляйте на фореме
// в спецальной теме по данному скрипту.
// http://forum.uokit.com/index.php?showtopic=26742
set #handlePilot findwindow ()
log #handlePilot
log close
log clear
log open

set #logSizeX 300
set #logSizeY 200

set #handleLog 0
while #handleLog = 0
      set #handleLog findwindow (Log Window)
end_while
set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set windowpos #x #y #logSizeX #logSizeY #handleLog
log mode compact

set workwindow 0
showwindow #handlePilot
log Укажите родительское окно (Ctrl+A)
while workwindow = 0
      wait 100
      showwindow #handlePilot
end_while
set #startHandle workwindow

log Теперь укажите дочернее окно (Ctrl+A)
while workwindow = #startHandle
      wait 100
      showwindow #handlePilot
end_while
set #targetHandle workwindow
log clear

// Получаем имя родительского окна.
set $ownerTitle getwindowtext (#startHandle)
if  $ownerTitle != "" // Генерируем только если у родительского окна есть имя.
    set $findwindow "findwindow"
    log set #ownerHandle $findwindow ($ownerTitle)
end_if

// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #targetHandle
set #i 1
set #n 1
while #startHandle <> %middleOwnerHandle [ #i ]
      set #i #i + 1
      set #arrToIntTmp %middleOwnerHandle [ #n ]
      set %middleOwnerHandle [ #i ] getwindow (#arrToIntTmp owner)
      set #n #n + 1  
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set $beginString "set #tmp getwindo"
set $middleString "w (#tmp"
set $w "w"
set #var getwindow (#startHandle child)
log set #tmp getwindo$w (#ownerHandle child)
set #i #sizeMiddleOwnerHandle - 1
set $direction ""
while #var <> #targetHandle  
      if  $direction <> ""
          log $beginString$middleString $direction)
      end_if
      // Выход за пределы массива
      if  #i > #sizeMiddleOwnerHandle
          log Ошибка!
          log Пути от родительского окна
          log к дочернему не существует.
          log Возможные причины данной ошибки:
          log 1) Вы спутали местами дочернее и родительское окно.
          log 2) Вы промазали и нажали Ctrl+A по другому окну.
          log 3) Дочернее окно не принадлежит родительскому.
      end_if
      // Текущее окно совпало с одним из чайлдов,
      // найденных в начале скрипта  
      if  %middleOwnerHandle [ #i ] = #var
          set #var getwindow (#var child)        
          set $direction child
          set #i #i - 1
      else
          set #var getwindow (#var next)
          set $direction next
      end_if
end_while
log set #childHandle getwindo$middleString $direction)

set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set #logSizeX 450
set #logSizeY screenheight / 8 * 5

set windowpos #x #y #logSizeX #logSizeY #handleLog

set $tmp "http:/"
set $tmp2 "/forum.uokit.com/index.php?showtopic=26742"
log
log  Автор скрипта DarkMaster.
log  Ветка на форуме: $tmp$tmp2


stop_script

Скрипт версия 1.2
Код
set linedelay 0
// Версия скрипта 1.2.
// Данный скрипт предназначен для автоматической
// генерации кода поиска дочернего окна.
// Автор DarkMaster.
// Вопросы и предложения оставляйте на фореме
// в спецальной теме по данному скрипту.
// http://forum.uokit.com/index.php?showtopic=26742
set #handlePilot findwindow ()
log #handlePilot
log close
log clear
log open

set #logSizeX 300
set #logSizeY 200

set #handleLog 0
while #handleLog = 0
      set #handleLog findwindow (Log Window)
end_while
set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set windowpos #x #y #logSizeX #logSizeY #handleLog
log mode compact

set workwindow 0
showwindow #handlePilot
log Укажите родительское окно (Ctrl+A)
while workwindow = 0
      wait 100
end_while
set #startHandle workwindow

log Теперь укажите дочернее окно (Ctrl+A)
while workwindow = #startHandle
      wait 100
end_while
set #targetHandle workwindow
log clear

// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #targetHandle
set #i 1
set #n 1
while #startHandle <> %middleOwnerHandle [ #i ]
      set #i #i + 1
      set #arrToIntTmp %middleOwnerHandle [ #n ]
      set %middleOwnerHandle [ #i ] getwindow (#arrToIntTmp owner)
      set #n #n + 1  
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set $beginString "set #tmp getwindo"
set $middleString "w (#tmp"
set $w "w"
set #var getwindow (#startHandle child)
log set #tmp getwindo$w (#ownerHandle child)
set #i #sizeMiddleOwnerHandle - 1
set $direction ""
while #var <> #targetHandle  
      if  $direction <> ""
          log $beginString$middleString $direction)
      end_if
      // Выход за пределы массива
      if  #i > #sizeMiddleOwnerHandle
          log Ошибка!
          log Пути от родительского окна
          log к дочернему не существует.
          log Возможные причины данной ошибки:
          log 1) Вы спутали местами дочернее и родительское окно.
          log 2) Вы промазали и нажали Ctrl+A по другому окну.
          log 3) Дочернее окно не принадлежит родительскому.
      end_if
      // Текущее окно совпало с одним из чайлдов,
      // найденных в начале скрипта  
      if  %middleOwnerHandle [ #i ] = #var
          set #var getwindow (#var child)        
          set $direction child
          set #i #i - 1
      else
          set #var getwindow (#var next)
          set $direction next
      end_if
end_while
log set #childHandle getwindo$middleString $direction)

set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set #logSizeX 450
set #logSizeY screenheight / 8 * 5

set windowpos #x #y #logSizeX #logSizeY #handleLog

set $tmp "http:/"
set $tmp2 "/forum.uokit.com/index.php?showtopic=26742"
log
log  Автор скрипта DarkMaster.
log  Ветка на форуме: $tmp$tmp2


stop_script

Скрипт версия 1.1
Код
set linedelay 0
// Версия скрипта 1.1.
// Данный скрипт предназначен для автоматической
// генерации кода поиска дочернего окна.
// Автор DarkMaster.
// Вопросы и предложения оставляйте на фореме
// в спецальной теме по данному скрипту.
// http://forum.uokit.com/index.php?showtopic=26742
set #handlePilot findwindow ()
log #handlePilot
log close
log clear
log open

set #logSizeX 300
set #logSizeY 200

set #handleLog 0
while #handleLog = 0
      set #handleLog findwindow (Log Window)
end_while
set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set windowpos #x #y #logSizeX #logSizeY #handleLog
log mode compact

set workwindow 0
showwindow #handlePilot
log Укажите родительское окно (Ctrl+A)
while workwindow = 0
      wait 100
end_while
set #ownerHandle workwindow

log Теперь укажите дочернее окно (Ctrl+A)
while workwindow = #ownerHandle
      wait 100
end_while
set #childHandle workwindow
log clear

// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #childHandle
set #i 1
set #n 1
while #ownerHandle <> %middleOwnerHandle [ #i ]
      set #i #i + 1
      set #tmp %middleOwnerHandle [ #n ]
      set %middleOwnerHandle [ #i ] getwindow (#tmp owner)
      set #n #n + 1  
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set #var getwindow (#ownerHandle child)
log "set #var getwindow (#ownerHandle child)"
set #i #sizeMiddleOwnerHandle - 1
while #var <> #childHandle
      // Выход за пределы массива
      if  #i > #sizeMiddleOwnerHandle
          log Ошибка!
          log Пути от родительского окна
          log к дочернему не существует.
          log Возможные причины данной ошибки:
          log 1) Вы спутали местами дочернее и родительское окно.
          log 2) Вы промазали и нажали Ctrl+A по другому окну.
          log 2) Дочернее окно не принадлежит родительскому.
      end_if
      // Текущее окно совпало с одним из чайлдов,
      // найденных в начале скрипта
      if  %middleOwnerHandle [ #i ] = #var
          set #var getwindow (#var child)
          if  #var = #childHandle
              log "set #childhandle getwindow (#var child)"
          else
              log "set #var getwindow (#var child)"
          end_if
          set #i #i - 1
      else
          set #var getwindow (#var next)
          if  #var = #childHandle
              log "set #childHandle getwindow (#var next)"
          else
              log "set #var getwindow (#var next)"
          end_if
      end_if
end_while

set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set #logSizeX 450
set #logSizeY screenheight / 8 * 5

set windowpos #x #y #logSizeX #logSizeY #handleLog

log
log  Внимание!
log  Перед использованием сгенерированного кода удалите кавчки. Если
log  есть идеи как обойти ограничения с экранированим кода для вывода
log  в лог, т.е. убрать кавычки, то пожалуйста сообщите на форум:
log  "http://forum.uokit.com/index.php?showtopic=26742"
log  Автор скрипта DarkMaster.

stop_script

Скрипт версия 1.0
Код
set linedelay 0
// Версия скрипта 1.1.
// Данный скрипт предназначен для автоматической
// генерации кода поиска дочернего окна.
// Автор DarkMaster.
// Вопросы и предложения оставляйте на фореме
// в спецальной теме по данному скрипту.
// http://forum.uokit.com/index.php?showtopic=26742

// Укажите хендлы окон.
set #ownerHandle 68890 // Родительское(главное) окно
set #childHandle 265598 // Конечное окно


log clear
log mode number

// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #childHandle
set #i 1
set #n 1
while #ownerHandle <> %middleOwnerHandle [ #i ]
      set #i #i + 1
      set #tmp %middleOwnerHandle [ #n ]
      set %middleOwnerHandle [ #i ] getwindow (#tmp owner)
      set #n #n + 1  
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set #var getwindow (#ownerHandle child)
log "set #var getwindow (#ownerHandle child)"
set #i #sizeMiddleOwnerHandle - 1
while #var <> #childHandle
      // Текущее окно совпало с одним из чайлдов,
      // найденных в начале скрипта
      if  %middleOwnerHandle [ #i ] = #var
          log "set #var getwindow (#var child)"
          set #var getwindow (#var child)
          set #i #i - 1
      else
          log "set #var getwindow (#var next)"
          set #var getwindow (#var next)
      end_if
end_while

stop_script
DarkMaster
Прилизано, обновлено.

Вопрос как уйти от кавычек все еще очень актуален.
Zeleax
Первый пример без кавычек
Код
set linedelay 0

// Укажите хендлы окон.
set #ownerHandle 14158476 // Родительское(главное) окно
set #childHandle 4195826 // Конечное окно

log open
log clear
log mode compact

// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #childHandle
set #i 1
set #n 1
while #ownerHandle <> %middleOwnerHandle [ #i ]
      set #i #i + 1
      set #tmp %middleOwnerHandle [ #n ]
      set %middleOwnerHandle [ #i ] getwindow (#tmp owner)
      set #n #n + 1  
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set #var getwindow (#ownerHandle child)
set $s1 set #var2 getwindo
set $s2 w (#ownerHandle2 child)
log $s1$s2
set #i #sizeMiddleOwnerHandle - 1
while #var <> #childHandle
      // Текущее окно совпало с одним из чайлдов,
      // найденных в начале скрипта
      if  %middleOwnerHandle [ #i ] = #var
          set $s1 set #var2 getwindo
          set $s2 w (#var2 child)
          log $s1$s2
          set #var getwindow (#var child)
          set #i #i - 1
      else
          set $s1 set #var2 getwindo
          set $s2 w (#var2 next)
          log $s1$s2          
          set #var getwindow (#var next)
      end_if
end_while

stop_script


По аналогии можно и имена переменных сохранить, если разбивать на 3 и более строковых переменных
Имхо, можно ещё и подпрограмку забацать, в которую передаются слова child, next и т.п., и которая формирует строку для вывода лог

З.Ы.: насчет обработки Ctrl+A классно ты придумал )
DarkMaster
При твоем варианте #var заменится. Причем даже если раскинуть на несколько переменных. Это уже все пройдено) А вот подпрограмма должна сработать.
Zeleax
Цитата(DarkMaster @ 24.10.2013, 21:21) *

При твоем варианте #var заменится. Причем даже если раскинуть на несколько переменных. Это уже все пройдено) А вот подпрограмма должна сработать.

этот скрипт уже проверен и работает правильно )
если переменная не инициализирована, то имя не будет заменено значением
DarkMaster
теперь понял, что ты сделал.

надо было под другим углом на это дело взглянуть. форум в этом помогает и сильно.
Zeleax
Твой скрипт работает отлично. Допили кавычки и будет идеально )

З.Ы.: возможно лучше использовать процедуры, а не подпрограммы для вывода в лог (переменные с любыми именами будут не инициализированы)
З.З.Ы.: одна голова хорошо, а форум лучше (с) smile.gif
DarkMaster
Допилил. Скрипт вряд ли будет использоваться внутри других так, что не думаю, что есть смысл в подпрограммах/процедурах.
DarkMaster
// Бэкап. Не обращаем внимания.

Скрипт предназначен для автоматической генерации кода поиска дочернего окна.
Для работы требуется версия не ниже 2.33

v. 1.0
Оно работает!
v. 1.1
Ввод хендлов через Ctrl+A.
Убраны возможные проблемы со свернутым окном лога.
Сделано цивильное отображение результата скрипта.
Итоговый хендл теперь содержится в переменной #childHandle, а не в #var.
v. 1.2
Теперь генерируется чистый код без паразитных кавычек. Спасибо Zeleax за идею.
Сильно облегчен алгоритм генерирования кода.
Скрипт версия 1.2
Код
set linedelay 0
// Данный скрипт предназначен для автоматической
// генерации кода поиска дочернего окна.
// Автор DarkMaster.
// Вопросы и предложения оставляйте на фореме
// в спецальной теме по данному скрипту.
// http://forum.uokit.com/index.php?showtopic=26742
set #handlePilot findwindow ()
log #handlePilot
log close
log clear
log open

set #logSizeX 300
set #logSizeY 200

set #handleLog 0
while #handleLog = 0
      set #handleLog findwindow (Log Window)
end_while
set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set windowpos #x #y #logSizeX #logSizeY #handleLog
log mode compact

set workwindow 0
showwindow #handlePilot
log Укажите родительское окно (Ctrl+A)
while workwindow = 0
      wait 100
end_while
set #startHandle workwindow

log Теперь укажите дочернее окно (Ctrl+A)
while workwindow = #startHandle
      wait 100
end_while
set #targetHandle workwindow
log clear

// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #targetHandle
set #i 1
set #n 1
while #startHandle <> %middleOwnerHandle [ #i ]
      set #i #i + 1
      set #arrToIntTmp %middleOwnerHandle [ #n ]
      set %middleOwnerHandle [ #i ] getwindow (#arrToIntTmp owner)
      set #n #n + 1  
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set $beginString "set #tmp getwindo"
set $middleString "w (#tmp"
set $w "w"
set #var getwindow (#startHandle child)
log set #tmp getwindo$w (#ownerHandle child)
set #i #sizeMiddleOwnerHandle - 1
set $direction ""
while #var <> #targetHandle  
      if  $direction <> ""
          log $beginString$middleString $direction)
      end_if
      // Выход за пределы массива
      if  #i > #sizeMiddleOwnerHandle
          log Ошибка!
          log Пути от родительского окна
          log к дочернему не существует.
          log Возможные причины данной ошибки:
          log 1) Вы спутали местами дочернее и родительское окно.
          log 2) Вы промазали и нажали Ctrl+A по другому окну.
          log 3) Дочернее окно не принадлежит родительскому.
      end_if
      // Текущее окно совпало с одним из чайлдов,
      // найденных в начале скрипта  
      if  %middleOwnerHandle [ #i ] = #var
          set #var getwindow (#var child)        
          set $direction child
          set #i #i - 1
      else
          set #var getwindow (#var next)
          set $direction next
      end_if
end_while
log set #childHandle getwindo$middleString $direction)

set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set #logSizeX 450
set #logSizeY screenheight / 8 * 5

set windowpos #x #y #logSizeX #logSizeY #handleLog

set $tmp "http:/"
set $tmp2 "/forum.uokit.com/index.php?showtopic=26742"
log
log  Автор скрипта DarkMaster.
log  Ветка на форуме: $tmp$tmp2


stop_script

Скрипт версия 1.1
Код
set linedelay 0
// Данный скрипт предназначен для автоматической
// генерации кода поиска дочернего окна.
// Автор DarkMaster.
// Вопросы и предложения оставляйте на фореме
// в спецальной теме по данному скрипту.
// http://forum.uokit.com/index.php?showtopic=26742
set #handlePilot findwindow ()
log #handlePilot
log close
log clear
log open

set #logSizeX 300
set #logSizeY 200

set #handleLog 0
while #handleLog = 0
      set #handleLog findwindow (Log Window)
end_while
set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set windowpos #x #y #logSizeX #logSizeY #handleLog
log mode compact

set workwindow 0
showwindow #handlePilot
log Укажите родительское окно (Ctrl+A)
while workwindow = 0
      wait 100
end_while
set #ownerHandle workwindow

log Теперь укажите дочернее окно (Ctrl+A)
while workwindow = #ownerHandle
      wait 100
end_while
set #childHandle workwindow
log clear

// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #childHandle
set #i 1
set #n 1
while #ownerHandle <> %middleOwnerHandle [ #i ]
      set #i #i + 1
      set #tmp %middleOwnerHandle [ #n ]
      set %middleOwnerHandle [ #i ] getwindow (#tmp owner)
      set #n #n + 1  
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set #var getwindow (#ownerHandle child)
log "set #var getwindow (#ownerHandle child)"
set #i #sizeMiddleOwnerHandle - 1
while #var <> #childHandle
      // Выход за пределы массива
      if  #i > #sizeMiddleOwnerHandle
          log Ошибка!
          log Пути от родительского окна
          log к дочернему не существует.
          log Возможные причины данной ошибки:
          log 1) Вы спутали местами дочернее и родительское окно.
          log 2) Вы промазали и нажали Ctrl+A по другому окну.
          log 2) Дочернее окно не принадлежит родительскому.
      end_if
      // Текущее окно совпало с одним из чайлдов,
      // найденных в начале скрипта
      if  %middleOwnerHandle [ #i ] = #var
          set #var getwindow (#var child)
          if  #var = #childHandle
              log "set #childhandle getwindow (#var child)"
          else
              log "set #var getwindow (#var child)"
          end_if
          set #i #i - 1
      else
          set #var getwindow (#var next)
          if  #var = #childHandle
              log "set #childHandle getwindow (#var next)"
          else
              log "set #var getwindow (#var next)"
          end_if
      end_if
end_while

set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set #logSizeX 450
set #logSizeY screenheight / 8 * 5

set windowpos #x #y #logSizeX #logSizeY #handleLog

log
log  Внимание!
log  Перед использованием сгенерированного кода удалите кавчки. Если
log  есть идеи как обойти ограничения с экранированим кода для вывода
log  в лог, т.е. убрать кавычки, то пожалуйста сообщите на форум:
log  "http://forum.uokit.com/index.php?showtopic=26742"
log  Автор скрипта DarkMaster.

stop_script

Скрипт версия 1.0
Код
set linedelay 0

// Укажите хендлы окон.
set #ownerHandle 68890 // Родительское(главное) окно
set #childHandle 265598 // Конечное окно


log clear
log mode number

// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #childHandle
set #i 1
set #n 1
while #ownerHandle <> %middleOwnerHandle [ #i ]
      set #i #i + 1
      set #tmp %middleOwnerHandle [ #n ]
      set %middleOwnerHandle [ #i ] getwindow (#tmp owner)
      set #n #n + 1  
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set #var getwindow (#ownerHandle child)
log "set #var getwindow (#ownerHandle child)"
set #i #sizeMiddleOwnerHandle - 1
while #var <> #childHandle
      // Текущее окно совпало с одним из чайлдов,
      // найденных в начале скрипта
      if  %middleOwnerHandle [ #i ] = #var
          log "set #var getwindow (#var child)"
          set #var getwindow (#var child)
          set #i #i - 1
      else
          log "set #var getwindow (#var next)"
          set #var getwindow (#var next)
      end_if
end_while

stop_script
cirus
Скрипт не работает для Paint.
DarkMaster
Какая версия и что есть не работает?

винда какая? пэинт везде разный.
DarkMaster
Сейчас протыкал через дерево окон и через скрипт. Если в 2 словах, то верхняя плашка окна (с крестиком, свернуть, развернуть) не является у пэинта родительским оконом, через нее привязывать скрипт бесполезно. Естественно найти путь от дочернего к родительскому не получится, т.к. это не дочернее и родительское окно. Можно сделать какой-нибудь гибрид с плагином, либо указывать в явном виде через findwindow хендл родительского окна.
cirus
Цитата
Какая версия и что есть не работает?
винда какая? пэинт везде разный.

Win7.
Цитата
Если в 2 словах, то верхняя плашка окна (с крестиком, свернуть, развернуть) не является у пэинта родительским оконом

Тогда понятно, почему не работает. Просто скрипт даже не доходит до строки где в лог выводятся варианты ошибки.

Сделал через плагин по классу окна.
crax
Всем доброе время суток!

Не могу определить handle чтобы автоматически привязываться к окну через set workwindow.
Через ctrl + a скрипт привязывается и работает нормально

Предполагаю что есть дочернее окно поэтому использовал скрипт из темы версии 1.3,
но результат для меня не понятен.

лог скрипта:

Код
set #ownerHandle findwindow (BlueStacks)
set #tmp getwindow (#ownerHandle child)
set #childHandle getwindow (#tmp )

Автор скрипта DarkMaster.
Ветка на форуме: http://forum.uokit.com/index.php?showtopic=26742


BlueStacks - родительское окно - это я понял
а дочернее?? #tmp ???
cirus
Цитата
а дочернее??

#childHandle
Код
set #ownerHandle findwindow (BlueStacks)
set #tmp getwindow (#ownerHandle child)
set #childHandle getwindow (#tmp )
set workwindow #childHandle    // сделать рабочим окном

crax
Тоесть если добавлю строчку
Log #childHandle
Получу его название?
cirus
Цитата
Тоесть если добавлю строчку
Log #childHandle
Получу его название?

Не название, а хендл окна.
crax
Цитата(cirus @ 16.10.2017, 15:18) *

Не название, а хендл окна.


в логе получаю только #childHandle ((
DarkMaster
Цитата
в логе получаю только #childHandle ((

Ну так а предыдущий код вы тоже вставили?
crax
разобрался спасибо!
cirus
v. 1.4
Добавлено получение кода для lua.
Добавлено workwindow (childHandle) и set workwindow #childHandle.
Скрипт версия 1.4
Код
set #lua 1    // если 1- код для lua, 0 - код для языка пилота


set linedelay 0
// Версия скрипта 1.4.
// Данный скрипт предназначен для автоматической
// генерации кода поиска дочернего окна.
// Автор DarkMaster.
// Вопросы и предложения оставляйте на форуме
// в специальной теме по данному скрипту.
// http://forum.uokit.com/index.php?showtopic=26742
set #handlePilot findwindow ()
log #handlePilot
log close
log clear
log open

set #logSizeX 300
set #logSizeY 200

set #handleLog 0
while #handleLog = 0
    set #handleLog findwindow (Log Window)
end_while
set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set windowpos #x #y #logSizeX #logSizeY #handleLog
log mode compact

set workwindow 0
showwindow #handlePilot
log Укажите родительское окно (Ctrl+A)
while workwindow = 0
    wait 100
    showwindow #handlePilot
end_while
set #startHandle workwindow

log Теперь укажите дочернее окно (Ctrl+A)
while workwindow = #startHandle
    wait 100
    showwindow #handlePilot
end_while
set #targetHandle workwindow
log clear

// Получаем имя родительского окна.
set $ownerTitle getwindowtext (#startHandle)
if  $ownerTitle != "" // Генерируем только если у родительского окна есть имя.
    set $findwindow "findwindow"
    if  #lua = 1
        set %quote [1] chr(34)
        set $if "if ownerHandle then"
        log --lua
        log local ownerHandle, tmp, childHandle = $findwindow ([[$ownerTitle]])
        log $if
    else
        log set #ownerHandle $findwindow ($ownerTitle)
    end_if
end_if


// Ищем от дочернего к родительскому, чтобы знать все child'ы
set %middleOwnerHandle #targetHandle
set #i 1
set #n 1
while #startHandle <> %middleOwnerHandle [ #i ]
    set #i #i + 1
    set #arrToIntTmp %middleOwnerHandle [ #n ]
    set %middleOwnerHandle [ #i ] getwindow (#arrToIntTmp owner)
    set #n #n + 1
end_while

set #sizeMiddleOwnerHandle size (%middleOwnerHandle)

// Перебираем от родительского к дочернему.
set $beginString "set #tmp getwindo"
set $middleString "w (#tmp"
set $w "w"
set #var getwindow (#startHandle child)

if #lua = 1
    log     tmp = getwindo$w (ownerHandle[1][1], "child")
else
    log set #tmp getwindo$w (#ownerHandle child)
end_if

set #i #sizeMiddleOwnerHandle - 1
set $direction ""
while #var <> #targetHandle
    if  $direction <> ""
        if  #lua = 1
            set $beginString "tmp = getwindo"
            set $middleString "w (tmp,"
            log     $beginString$middleString %quote [1]$direction%quote [1])
       else
            log $beginString$middleString $direction)
        end_if
    end_if

    // Выход за пределы массива
    if  #i > #sizeMiddleOwnerHandle
        log Ошибка!
        log Пути от родительского окна
        log к дочернему не существует.
        log Возможные причины данной ошибки:
        log 1) Вы спутали местами дочернее и родительское окно.
        log 2) Вы промазали и нажали Ctrl+A по другому окну.
        log 3) Дочернее окно не принадлежит родительскому.
    end_if
    // Текущее окно совпало с одним из чайлдов,
    // найденных в начале скрипта
    if  %middleOwnerHandle [ #i ] = #var
        set #var getwindow (#var child)
        set $direction child
        set #i #i - 1
    else
        set #var getwindow (#var next)
        set $direction next
    end_if
end_while


if  #lua = 1
    set $middleString "w (tmp,"
    set $workwin "workwindow (childHandle)"
    log     childHandle = getwindo$middleString %quote [1]$direction%quote [1])
    log     $workwin
    log end
else
    set $workwin "set workwindow #childHandle"
    log set #childHandle getwindo$middleString $direction)
    log $workwin
end_if


set #x (screenwidth  - #logSizeX) / 2
set #y screenheight / 4
set #logSizeX 450
set #logSizeY screenheight / 8 * 5

set windowpos #x #y #logSizeX #logSizeY #handleLog

set $tmp "http:/"
set $tmp2 "/forum.uokit.com/index.php?showtopic=26742"
log
log  Автор скрипта DarkMaster.
log  Ветка на форуме: $tmp$tmp2


stop_script
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.