Помощь - Поиск - Пользователи - Календарь
Полная версия: Плагин для получения информации об окне.
UoKit.com Форумы > Кликер > UO Pilot > Плагины и доп. ПО
DarkMaster
Потихоньку начинаю все приводить к товарному виду.

WindowStatus.Parent - готов.
WindowStatus.Find - Поиск окна по имени и классу - готов.
WindowStatus.allStatus - не допилен.
WindowStatus.Top - не допилен, работает только с потоками не принадлежащими плоту.
WindowStatus.Ready - страдает из-за WindowStatus.Top.

Предложения, что еще выдернуть по статусам окна приветствуются.
В планах есть:
Поиск окна по имени и классу.
Анализ видимости окна на экране и координаты видимой точки.

windowName (<handle>) - запрашивает имя окна.

windowName (<handle>) - запрашивает имя окна.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Первый элемент массива содержит код ошибки:
0 - функция успешно вернула данные.
1 - внутренняя ошибка функции.
2 - хендл не существует.
Второй элемент содержит имя окна.
Код
set %a WindowStatus.windowName(workwindow)
log  имя окна:                %a [1 1]        %a [1 2]

className (<handle>) - запрашивает класс имя окна.

className (<handle>) - запрашивает класс имя окна.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Первый элемент массива содержит код ошибки:
0 - функция успешно вернула данные.
1 - внутренняя ошибка функции.
2 - хендл не существует.
Второй элемент содержит имя класса окна.
Код
set %a WindowStatus.className (workwindow)
log  имя класса окна:         %a [1 1]        %a [1 2]

pidAndTid (<handle>) - запрашивает PID и TID процесса, которому принадлежит окно.

pidAndTid (<handle>) - запрашивает PID и TID процесса, которому принадлежит окно. PID - номер процесса, TID - номер потока.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
В первый элемент массива помещается результат запроса PID'а.
Во второй элемент массива помещается результат запроса TID'a.
Возвращает результат:
0 - ошибка функции.
4 - хендл не существует.
x - все прочие значения являются корректными ID.
Код
set %a WindowStatus.pidAndTid (workwindow)
log  PID:                     %a [ 1 1 ]
log  TID:                     %a [ 1 2 ]

windowSize (<handle>) - получение сведений о размере и расположении окна.

windowSize (<handle>) - получение сведений о размере и расположении окна. Результат функции должен принимать массив.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Первый элемент массива содержит код ошибки:
0 - функция успешно вернула данные.
1 - внутренняя ошибка функции.
2 - хендл не существует.
Код
set %a WindowStatus.windowSize (workwindow)
log  получение размера успех: %a [ 1 1 ]
log  ширина:                  %a [ 1 2 ]
log  высота:                  %a [ 1 3 ]
log  startx:                  %a [ 1 4 ]
log  startY:                  %a [ 1 5 ]
log  endX:                    %a [ 1 6 ]
log  endY:                    %a [ 1 7 ]

minimized (<handle>) - запрашивает свернуто ли окно.

minimized (<handle>) - запрашивает свернуто ли окно.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - не минимизировано.
1 - минимизировано.
2 - хендл не существует.
Код
set #a WindowStatus.minimized (workwindow)
log  минимизировано:          #a

maximized (<handle>) - запрашивает максимизировано ли окно (развернуто на весь экран).

maximized (<handle>) - запрашивает максимизировано ли окно (развернуто на весь экран).
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - не максимизировано.
1 - максимизировано.
2 - хендл не существует.
Код
set #a WindowStatus.maximized (workwindow)
log  максимизировано:         #a

visible (<handle>) - запрашивает видимо ли окно.

visible (<handle>) - запрашивает видимо ли окно. Подразумевается флаг скрытого окна, а не фактическая видимость на экране.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - невидимо.
1 - видимо.
2 - хендл не существует.
Код
set #a WindowStatus.visible (workwindow)
log  видимое:                 #a

enabled (<handle>) - запрашивает восприимчивость окна для совершения действий (клики, нажатия клавиш и т.д.).

enabled (<handle>) - запрашивает восприимчивость окна для совершения действий (клики, нажатия клавиш и т.д.).
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - блокировано.
1 - доступно.
2 - хендл не существует.
Код
set #a WindowStatus.enabled (workwindow)
log  доступно:                #a

top (<handle>) - запрашивает является ли данное окно в фокусе (на переднем плане).

top (<handle>) - запрашивает является ли данное окно в фокусе (на переднем плане).
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - окно не на переднем плане.
1 - окно на переднем плане.
2 - хендл не существует.
Код
set #a WindowStatus.top (workwindow)
log  на переднем плане:       #a

topmost (<handle>) - запрашивает является ли окно отображаемым поверх всех окон.

topmost (<handle>) - запрашивает является ли окно отображаемым поверх всех окон.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - не поверх всех окон.
1 - поверх всех окон.
2 - хендл не существует.
Код
set #a WindowStatus.topmost (workwindow)
log  поверх всех окон:        #a

parentTop (<handle>) - запрашивает на переднем плане находится родительское окно или нет.

parentTop (<handle>) - запрашивает на переднем плане находится родительское окно или нет. Под родительским окном подразумевается окно верхнего уровня.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - не на переднем плане.
1 - на переднем плане.
2 - хендл не существует.
Код
set %a WindowStatus.parentTop (workwindow)
log  родительское активно:    %a[1 1]    %a[1 2]

upper (<handle>) - запрашивает является ли окном верхнего уровня.

upper (<handle>) - запрашивает является ли окном верхнего уровня.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - верхнего уровня.
1 - дочернее.
2 - хендл не существует.
Код
set #a WindowStatus.upper (workwindow)
log  верхнего уровня (род):   #a

ready (<handle>) - комплексный запрос информации об окне с целью понять готовность окна к работе.

ready (<handle>) - представляет собой комплексный запрос информации об окне с целью понять готовность окна к работе. Окно считается готовым к работе, если оно:не минимизировано, видимо, доступно, на переднем плане.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
0 - не минимизировано.
1 - минимизировано.
2 - хендл не существует.
Код
set #a WindowStatus.ready (workwindow)
log  готово к работе:         #a

allStatus (<handle>) - собирает полную информацию об окне.

allStatus (<handle>) - собирает полную информацию об окне. В стадии разработки.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
Возвращает результат:
parentAndChild (<handleParent> <handleChild>) - запрашивает является ли пара окон друг другу родительским и дочерним.

parentAndChild (<handleParent> <handleChild>) - запрашивает является ли пара окон друг другу родительским и дочерним.
<handle> - обязательный параметр. Содержит в себе хендл окна о котором запрашивается информация. Для запроса информации о рабочем окне можно указать 'workwindow'(без кавычек).
<handleParent> - хендл родительского окна.
<handleChild> - хендл дочернего окна.
Возвращает результат:
0 - не являются родительским и дочерним.
1 - являются родительским и дочерним.
2 - хендл не существует.
Код
set #a WindowStatus.parentAndChild (#handleParent #handleChild)
log  родительское и дочернее: #a

find (<fullNameFlag><caseNameFlag><fullClassNameFlag><caseClassNameFlag> <windowName> <windowClassName>) - функция поиска окон по заданным имени и классу.

find (<fullNameFlag><caseNameFlag><fullClassNameFlag><caseClassNameFlag> <windowName> <windowClassName>) - функция поиска окон по заданным имени и классу. Результат работы должен принимать массив, т.к. находятся все окна с заданными параметрами, а не только первое совпавшее.
<fullNameFlag> - флаг полного имени. В выключенном состоянии позволяет задать только часть имени. 0 - выкл, 1 - вкл.
<caseNameFlag> - флаг чувствительности к регистру букв при сравнении имени окна. 0 - выкл, 1 - вкл.
<fullClassNameFlag> - флаг полного имени класса. В выключенном состоянии позволяет задать только часть имени класса. 0 - выкл, 1 - вкл.
<caseClassNameFlag> - флаг чувствительности к регистру букв при сравнении имени класса окна. 0 - выкл, 1 - вкл.
<windowName> - имя окна, которое требуется найти.
<windowClassName> - имя класса окна, которое требуется найти.
Флаги могут задаваться как слитно, так и раздельно.
Имена окна и класса окна задаются через пробел. Если имя содержит в себе пробелы, то необходимо обособить его знаками '*' (без кавычек).
Если необходимо проигнорировать имя или класс окна, то следует задать параметр пустым с помощью символов '*', например:
Код
set %a WindowStatus.find (1111 ** TchatFrm)
set %a WindowStatus.find (1111 *Окно чата* **)

Возвращает хендлы найденных окон в элементы массива:
%arr [1 1]
%arr [1 2]
%arr [1 3]
и т.д.
Если окон не было найдено, то в:
%arr [1 1] помещается ноль.
Код
set %a WindowStatus.find (1111 *Окно чата* TchatFrm)
log  найдено:                %a [1 1]    %a [1 2]    %a [1 3]    %a [1 4]
set %a WindowStatus.find (0110 Браузер myClass)
log  найдено:                %a [1 1]    %a [1 2]    %a [1 3]    %a [1 4]



Глобальный скрипт по выводу информации об окне
Код

set linedelay 0
set #dev 1
if  #dev = 1
    log close
    log clear
    log open 1430 -10 500 1080
    log mode compact
    set #handleLogWindow findwindow ("Log Window")
    showwindow #handleLogWindow restore
    set #handleUoPilot findwindow ("UoPilot")
end_if
set $bmp ".bmp"

:start

//wait 2s
//pluginload pluginunload pluginreload
//pluginunload
//filedelete
//filecopy
//pluginload

set #window workwindow

set %a WindowStatus.windowName(#window)
log  имя окна:                %a [1 1]        %a [1 2]
set %a WindowStatus.className (#window)
log  имя класса окна:         %a [1 1]        %a [1 2]
set %a WindowStatus.pidAndTid (#window)
log  PID:                     %a [ 1 1 ]
log  TID:                     %a [ 1 2 ]
set %a WindowStatus.windowSize (#window)
log  получение размера успех: %a [ 1 1 ]
log  ширина:                  %a [ 1 2 ]
log  высота:                  %a [ 1 3 ]
log  startx:                  %a [ 1 4 ]
log  startY:                  %a [ 1 5 ]
log  endX:                    %a [ 1 6 ]
log  endY:                    %a [ 1 7 ]
set #a WindowStatus.minimized (#window)
log  минимизировано:          #a
set #a WindowStatus.maximized (#window)
log  максимизировано:         #a
set #a WindowStatus.visible (#window)
log  видимое:                 #a
set #a WindowStatus.enabled (#window)
log  доступно:                #a
set #a WindowStatus.top (#window)
log  на переднем плане:       #a
//set %a WindowStatus.top (#window)
//log  %a [1 1]
//log  %a [1 2]
//log  %a [1 3]
//log  %a [1 4]
//log  %a [1 5]
set #a WindowStatus.topmost (#window)
log  поверх всех окон:        #a
set %a WindowStatus.parentTop (#window)
log  родительское активно:    %a[1 1]    %a[1 2]
set #a WindowStatus.upper (#window)
log  верхнего уровня (род):   #a
set #a WindowStatus.ready (#window)
log  готово к работе:         #a
log ______________________
set #a WindowStatus.parentAndChild (198492 525830)
log  родительское и дочернее: #a
set %a WindowStatus.find (1111 *Окно чата* TchatFrm)
log  найдено:                %a [1 1]    %a [1 2]    %a [1 3]    %a [1 4]
Cockney
Немного не понял задачу плагина, но.... можно ли выдернуть информацию о кнопках и других контролах?
cirus
Этот вариант плагина нормально запускается и работает.
DarkMaster
Цитата
Немного не понял задачу плагина

Задача в 1 очередь была вытянуть состояние видимио/минимизировано/максимизировано и т.д. Остальное зацепил мимоходом с целью иметь полноценный инструмент. В т.ч. чтобы иметь максимум данных для идентификации безымянных окон, например, тех же кнопок, которые зачастую являются отдельными окнами.
Цитата
можно ли выдернуть информацию о кнопках и других контролах?

Конкретнее.

Цитата
Этот вариант плагина нормально запускается и работает.

оно и те нормально запускались и работали. Просто нужны были дллки для дебаг версий, которые не идут в стандартном установщике.
Cockney
Цитата(DarkMaster @ 19.8.2015, 5:49) *

Конкретнее.



Размер кнопок, полей ввода. Доступность контрола для ввода,нажатия и др.
DarkMaster
Цитата
Размер кнопок

Как правило - это и есть размер окна. Кнопка - это отдельное окно.
Цитата
полей ввода

Поля ввода - это тоже зачастую тот же самый размер окна. Поле ввода - это отдельное окно, если идет речь об WinAPI, если же это сделано на фреймворках или каких-то своих изобретениях оконных(типа браузеров), то это надо делать под конкретное приложение.
Цитата
Доступность контрола для ввода, нажатия и др

Цитата
set #a WindowStatus.enabled

Т.е. по факту это все есть. Координаты только надо дополнительно допилить относительные от родительского окна. Тут пока еще стоит вопрос, как получить окно верхнего уровня, но это в любом случае решаемо (не хочу через перебор делать).
DarkMaster
Цитата
set #a WindowStatus.top (hdf)
log на переднем плане: #a

Вот это кстати вернет будет ли именно в данное окно нажатие sendex'ом и другие действия происходящие именно в активное на данный момент окно.
cirus
Цитата
Вот это кстати вернет будет ли именно в данное окно нажатие sendex'ом и другие действия происходящие именно в активное на данный момент окно.

А оно работает? Всегда 0 показывает, хотя окно активно и на переднем плане.
DarkMaster
Хм... Где-то отвалил, когда под релиз немного причесывал. Работало smile.gif
DarkMaster
Поправил. Ковыряю фишечки дальше. Релизить буду хоть что-то толковое.
Cockney, надо что-то из этого? Пара вещей заинтересовала меня.
http://www.vsokovikov.narod.ru/New_MSDN_AP...ithreadinfo.htm
Cockney
Цитата(DarkMaster @ 20.8.2015, 14:54) *

Cockney, надо что-то из этого?




Ну, что мне пока хотелось бы, уже вроде как есть, осталось что-то придумать для прямого нажатия на контролы, не через пилотовский клик, но это другая история.

Я конечно не знаю, как в играх может пригодится весь этот набор плюшек, но думаю что и этого достаточно. Хотя.. вам видней.
DarkMaster
Цитата
Ну, что мне пока хотелось бы, уже вроде как есть, осталось что-то придумать для прямого нажатия на контролы, не через пилотовский клик, но это другая история.

Кнопки ожидают эвента, обычно либо клика либо клавиши. Прямое нажатие сводится к посылу этого эвента в кнопку, т.е. в окно кнопки. Кароче:
Код
set #lastWorkWindow workwindow
set workwindow хендл_кнопки
send217 {Spacebar}
set  workwindow #lastWorkWindow

Писанины многовато, но это должно сделать желаемое.
Cockney
хорощо,просто не знал, про данный метод
DarkMaster
Цитата
хорощо,просто не знал, про данный метод

Зато как много узнал, что оказывается можно уже сейчас smile.gif Польза wink.gif
cirus
Если убрана галка автоматически отрывать лог, при этом галка выводить в лог ошибки загрузки плагинов стоит, то после закрытия пилота выскакивает пару окон с ошибками.
DarkMaster
21.08.2015 18:57:04, WKnight
починил падение
DarkMaster
Глобальный апдейт.
Починен upper(он же parent).
Добавлен комбайн поиска окон по имени и классу.
Добавлена возможность указать хендл.
Модифицированы все функции в части корректности и контроля ошибок.
cirus
Начиная с 39 строки выдает: символ не распознан (pos:1 'WindowsStatus.minimized (хендл окна)')
DarkMaster
Вообще везде или только в 39 строке? Только что запустил - все отработало нормально.
Через set запускаешь?
cirus
Все set начиная с 39 строки и массив с данными об окне пуст.
DarkMaster
Ща на почту скину пилота, на этой версии попробуй.

А ты дллку в WindowStatus переимновал?
cirus
Цитата
А ты дллку в WindowStatus переимновал?

Теперь работает.
DarkMaster
имена плагинов жестко привязаны к именам дллок.
Наверняка есть пачка багов. По сути это ночная сборка, финд только дописал. Никогда бы не подумал, что эта хреновина займет 250 строк + 200 дубля для дочерних.
cirus
Цитата
<fullClassNameFlag> - флаг полного имени.

Имени класса.
Я так понял поиск работает при условии что у окна есть имя?
Цитата
Наверняка есть пачка багов.

Куда ж без них.
DarkMaster
Цитата
Я так понял поиск работает при условии что у окна есть имя?

Да, но имя может быть пустым. Попробуй вместо имени указать **. Это был последний допил, не тестил, но работать должно.


То что окно минимизировано не означает, что в его стиле установлены флаги невидимости, недоступности, поверх всех окон. Надо продумать описание, чтобы не было путаницы. Возьми windowscanner и все станет более-менее понятно по флагам - там есть кнопочки управления видимостью/доступностью и т.д. Про "на переднем плане" косяков много, его нужно переделывать по сути, там есть не совсем понятные моменты, как его вытаскивать.
cirus
Цитата
Да, но имя может быть пустым. Попробуй вместо имени указать **. Это был последний допил, не тестил, но работать должно.

Работает, если ** поставить.
cirus
Цитата
%a WindowStatus.parentTop (workwindow)
#a WindowStatus.upper (workwindow)
#a WindowStatus.ready (workwindow)

Допиши set в описании под спойлером.
Цитата
set %a[1] WindowStatus.find (1111 *Окно чата* TchatFrm)
log найдено: %a [1 1] %a [1 2] %a [1 3] %a [1 4]
Возвращает хендлы найденных окон в элементы массива:
%arr [1 1]
%arr [1 2]
%arr [1 3]

Подправь имена массива, а то отличаются.
Кстати, все найденные окна записываются в %a [1 1]. Остальные части массива пустые.
DarkMaster
Спасибо. Интересно как так получилось... копипастил все...
cirus
Цитата
set %a[1] WindowStatus.find (1111 *Окно чата* TchatFrm)

Скорее всего так:
Код
set %a WindowStatus.find (1111 *Окно чата* TchatFrm)
DarkMaster
А вот это с теста осталось smile.gif
cirus
Цитата
А вот это с теста осталось smile.gif

Я бы даже сказал, что оно до сих пор осталось. По спойлером Find.
DarkMaster
Вроде убирал... Убрал еще раз... Спасибо.
cirus
Цитата
ready (<handle>)
0 - не минимизировано.
1 - минимизировано.
2 - хендл не существует.

Наверное должно быть:
0 - не готово
1 - готово
CAHEK-555
Приветствую участников данного форума!

DarkMaster, в описании к функции allStatus не хватает информации как с ней взаимодействовать.
Цитата
Возвращает результат:


Возможно такое описание после исследования работы функции и её ответов:
Цитата
Возвращает имя окна, имя класса окна, PID, TID и информацию об успешном получении размера, ширине, высоте, начальных и конечных координатах в элемент массива (данные разделены табуляцией): %a [1 1]
Если окон не было найдено, то результаты помещаются из соответствующих функций по порядку windowName, className, pidAndTid, windowSize (данные разделены табуляцией) в: %a [1 1]

Код
set %a WindowStatus.allStatus(#window)
log  Информация об окне:    %a [1 1].


Также хотелось видеть функцию поиска пути к дочернему окну как уже реализовано в скрипте, но только силами плагина (чтобы упростить написание скрипта и не загромождать код).
cirus
Удалено.
фонарик
Товарищ DarkMaster, есть очень сильные подозрения что ваш замечательный плагин для операций с числами, имеющих плавающую запятую, math.dll перестаёт работать если добавить в пилот плагин WindowStatus.dll unsure.gif Хотя лог показывает что оба они загрузились и между собой не ссорились mellow.gif
DarkMaster
Там какие-то косяки с локалями. Я уже не помню, если честно. Одна локаль убивает другую, а работают он в разных. Бред какой-то написал... но они точно ругались из-за локалей.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.