Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ Плагины и доп. ПО _ Плагин для получения информации об окне.

Автор: DarkMaster 18.8.2015, 23:52

Потихоньку начинаю все приводить к товарному виду.

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]



Прикрепленные файлы
Прикрепленный файл  WindowStatus_0.9.zip ( 7,13 килобайт ) Кол-во скачиваний: 1394

Автор: Cockney 19.8.2015, 0:12

Немного не понял задачу плагина, но.... можно ли выдернуть информацию о кнопках и других контролах?

Автор: cirus 19.8.2015, 2:38

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

Автор: DarkMaster 19.8.2015, 5:49

Цитата
Немного не понял задачу плагина

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

Конкретнее.

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

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

Автор: Cockney 19.8.2015, 11:29

Цитата(DarkMaster @ 19.8.2015, 5:49) *

Конкретнее.



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

Автор: DarkMaster 19.8.2015, 18:30

Цитата
Размер кнопок

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

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

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

Т.е. по факту это все есть. Координаты только надо дополнительно допилить относительные от родительского окна. Тут пока еще стоит вопрос, как получить окно верхнего уровня, но это в любом случае решаемо (не хочу через перебор делать).

Автор: DarkMaster 19.8.2015, 19:36

Цитата
set #a WindowStatus.top (hdf)
log на переднем плане: #a

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

Автор: cirus 20.8.2015, 2:17

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

А оно работает? Всегда 0 показывает, хотя окно активно и на переднем плане.

Автор: DarkMaster 20.8.2015, 11:40

Хм... Где-то отвалил, когда под релиз немного причесывал. Работало smile.gif

Автор: DarkMaster 20.8.2015, 14:54

Поправил. Ковыряю фишечки дальше. Релизить буду хоть что-то толковое.
Cockney, надо что-то из этого? Пара вещей заинтересовала меня.
http://www.vsokovikov.narod.ru/New_MSDN_API/Window/str_guithreadinfo.htm

Автор: Cockney 20.8.2015, 18:34

Цитата(DarkMaster @ 20.8.2015, 14:54) *

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




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

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

Автор: DarkMaster 20.8.2015, 18:55

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

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

Писанины многовато, но это должно сделать желаемое.

Автор: Cockney 20.8.2015, 22:06

хорощо,просто не знал, про данный метод

Автор: DarkMaster 21.8.2015, 1:31

Цитата
хорощо,просто не знал, про данный метод

Зато как много узнал, что оказывается можно уже сейчас smile.gif Польза wink.gif

Автор: cirus 21.8.2015, 2:28

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

Автор: DarkMaster 21.8.2015, 15:59

21.08.2015 18:57:04, WKnight
починил падение

Автор: DarkMaster 24.8.2015, 0:42

Глобальный апдейт.
Починен upper(он же parent).
Добавлен комбайн поиска окон по имени и классу.
Добавлена возможность указать хендл.
Модифицированы все функции в части корректности и контроля ошибок.

Автор: cirus 24.8.2015, 1:10

Начиная с 39 строки выдает: символ не распознан (pos:1 'WindowsStatus.minimized (хендл окна)')

Автор: DarkMaster 24.8.2015, 1:40

Вообще везде или только в 39 строке? Только что запустил - все отработало нормально.
Через set запускаешь?

Автор: cirus 24.8.2015, 1:47

Все set начиная с 39 строки и массив с данными об окне пуст.


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: DarkMaster 24.8.2015, 1:53

Ща на почту скину пилота, на этой версии попробуй.

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

Автор: cirus 24.8.2015, 1:57

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

Теперь работает.

Автор: DarkMaster 24.8.2015, 1:59

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

Автор: cirus 24.8.2015, 2:41

Цитата
<fullClassNameFlag> - флаг полного имени.

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

Куда ж без них.


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: DarkMaster 24.8.2015, 11:57

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

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


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

Автор: cirus 24.8.2015, 12:24

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

Работает, если ** поставить.

Автор: cirus 25.8.2015, 3:23

Цитата
%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 25.8.2015, 11:16

Спасибо. Интересно как так получилось... копипастил все...

Автор: cirus 25.8.2015, 11:44

Цитата
set %a[1] WindowStatus.find (1111 *Окно чата* TchatFrm)

Скорее всего так:
Код
set %a WindowStatus.find (1111 *Окно чата* TchatFrm)

Автор: DarkMaster 25.8.2015, 11:59

А вот это с теста осталось smile.gif

Автор: cirus 11.11.2015, 13:46

Цитата
А вот это с теста осталось smile.gif

Я бы даже сказал, что оно до сих пор осталось. По спойлером Find.

Автор: DarkMaster 11.11.2015, 14:19

Вроде убирал... Убрал еще раз... Спасибо.

Автор: cirus 14.2.2016, 22:23

Цитата
ready (<handle>)
0 - не минимизировано.
1 - минимизировано.
2 - хендл не существует.

Наверное должно быть:
0 - не готово
1 - готово

Автор: CAHEK-555 13.1.2017, 4:08

Приветствую участников данного форума!

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

Цитата
Возвращает результат:


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

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


Также хотелось видеть функцию поиска пути к дочернему окну как уже реализовано в https://forum.uokit.com/index.php?showtopic=26742, но только силами плагина (чтобы упростить написание скрипта и не загромождать код).

Автор: cirus 28.1.2017, 22:44

Удалено.

Автор: фонарик 3.8.2021, 12:23

Товарищ DarkMaster, есть очень сильные подозрения что ваш замечательный плагин для операций с числами, имеющих плавающую запятую, math.dll перестаёт работать если добавить в пилот плагин WindowStatus.dll unsure.gif Хотя лог показывает что оба они загрузились и между собой не ссорились mellow.gif

Автор: DarkMaster 9.8.2021, 18:32

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

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)