Здравствуйте, гость ( Вход | Регистрация )

> Поиск пути к дочернему окну(скрипт)
DarkMaster
сообщение 23.10.2013, 16:55
Сообщение #1


***********

Модератор UOPilot
Сообщений: 9.776
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 30130
Пользователь №: 11.279



Скрипт предназначен для автоматической генерации кода поиска дочернего окна.
Для работы требуется версия не ниже 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 - 21.1.2019, 5:50


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____

Контакт актуален, подпись актуальна.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
DarkMaster
сообщение 16.10.2017, 20:06
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.776
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 30130
Пользователь №: 11.279



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

Ну так а предыдущий код вы тоже вставили?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____

Контакт актуален, подпись актуальна.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
DarkMaster   Поиск пути к дочернему окну(скрипт)   23.10.2013, 16:55
DarkMaster   Прилизано, обновлено. Вопрос как уйти от кавычек ...   24.10.2013, 20:20
Zeleax   set linedelay 0 // Укажите хендлы окон. set #owne...   24.10.2013, 20:38
DarkMaster   При твоем варианте #var заменится. Причем даже есл...   24.10.2013, 21:21
Zeleax   При твоем варианте #var заменится. Причем даже ес...   24.10.2013, 23:12
DarkMaster   теперь понял, что ты сделал. надо было под другим...   24.10.2013, 23:30
Zeleax   Твой скрипт работает отлично. Допили кавычки и буд...   24.10.2013, 23:41
DarkMaster   Допилил. Скрипт вряд ли будет использоваться внутр...   25.10.2013, 0:26
DarkMaster   // Бэкап. Не обращаем внимания. Скрипт предназнач...   6.7.2015, 21:08
cirus   Скрипт не работает для Paint.   11.11.2015, 13:50
DarkMaster   Какая версия и что есть не работает? винда какая?...   11.11.2015, 14:20
DarkMaster   Сейчас протыкал через дерево окон и через скрипт. ...   11.11.2015, 14:33
cirus   Win7. Тогда понятно, почему не работает. Просто ...   11.11.2015, 15:14
crax   Всем доброе время суток! Не могу определить h...   16.10.2017, 14:45
crax   разобрался спасибо!   28.11.2017, 17:27
cirus   #childHandle set #ownerHandle findwindow (Blu...   16.10.2017, 14:53
crax   Тоесть если добавлю строчку Log #childHandle Пол...   16.10.2017, 15:00
cirus   Не название, а хендл окна.   16.10.2017, 15:18
crax   Не название, а хендл окна. в логе получаю тольк...   16.10.2017, 15:42
cirus   v. 1.4 Добавлено получение кода для lua. Добавлено...   29.12.2018, 21:49


Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 20.3.2026, 10:11
Designed by Nickostyle