Автор: 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 килобайт )
Кол-во скачиваний: 1398
Автор: DarkMaster 19.8.2015, 5:49
Цитата
Немного не понял задачу плагина
Задача в 1 очередь была вытянуть состояние видимио/минимизировано/максимизировано и т.д. Остальное зацепил мимоходом с целью иметь полноценный инструмент. В т.ч. чтобы иметь максимум данных для идентификации безымянных окон, например, тех же кнопок, которые зачастую являются отдельными окнами.
Цитата
можно ли выдернуть информацию о кнопках и других контролах?
Конкретнее.
Цитата
Этот вариант плагина нормально запускается и работает.
оно и те нормально запускались и работали. Просто нужны были дллки для дебаг версий, которые не идут в стандартном установщике.
Автор: DarkMaster 19.8.2015, 18:30
Цитата
Размер кнопок
Как правило - это и есть размер окна. Кнопка - это отдельное окно.
Цитата
полей ввода
Поля ввода - это тоже зачастую тот же самый размер окна. Поле ввода - это отдельное окно, если идет речь об WinAPI, если же это сделано на фреймворках или каких-то своих изобретениях оконных(типа браузеров), то это надо делать под конкретное приложение.
Цитата
Доступность контрола для ввода, нажатия и др
Цитата
set #a WindowStatus.enabled
Т.е. по факту это все есть. Координаты только надо дополнительно допилить относительные от родительского окна. Тут пока еще стоит вопрос, как получить окно верхнего уровня, но это в любом случае решаемо (не хочу через перебор делать).
Автор: 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
Писанины многовато, но это должно сделать желаемое.
Автор: DarkMaster 21.8.2015, 1:31
Цитата
хорощо,просто не знал, про данный метод
Зато как много узнал, что оказывается можно уже сейчас
Польза
Автор: 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]. Остальные части массива пустые.
Автор: 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, но только силами плагина (чтобы упростить написание скрипта и не загромождать код).