Страница 121 из 130
Добавлено: Вс дек 04, 2016 23:54
MVV
Flasher писал(а):Только 1 и начинается с 1.
Ну тогда совсем несложно будет переводить одно в другое.
Не понятна реализация. Как формально комбинируется эта псевдопеременная с varset/varget, что и в каком виде она возвращает?
Переменная просто возвращает глубину вложенности вызовов макросов/команд. Каждый следующий вложенный вызов команды или макроса (не функции) - это +1 к уровню.
И ещё вопрос - как получить текст окна? Т.е. необходимо записать имеющийся текст, например, в varset, а потом подставить его с добавкой в settext. Скажем, на примере заголовка панели. Это возможно?
Возврат строк из функций всё ещё не поддерживается.
Добавлено: Пн дек 05, 2016 00:33
Flasher
MVV писал(а):Ну тогда совсем несложно будет переводить одно в другое.
Ну, в принципе, да, 1 отнимать.
MVV писал(а):Переменная просто возвращает глубину вложенности вызовов макросов/команд.
А почему именно глубина, а не порядковый номер? Это меня и сбило с толку. Хотелось бы разобрать:
Код: Выделить всё
eval(varset(@lvl, findwnd(TMyComboBox, , , 0, 1))
varset поставляет в переменную значение, полученное findwnd. Но как туда попадает позиция в дереве окон?
MVV писал(а):Возврат строк из функций всё ещё не поддерживается.
А вот пригодился бы теперь.
Добавлено: Пн дек 05, 2016 12:26
MVV
А почему именно глубина, а не порядковый номер? Это меня и сбило с толку. Хотелось бы разобрать:
Собственно, после возврата из функции (после подъёма на уровень вверх) её переменные уже не нужны и могут быть переиспользованы. И потом, глубина вложенности в TCFS2 уже есть, используется для защиты от зацикливания.
А что такое порядковый номер?
varset поставляет в переменную значение, полученное findwnd. Но как туда попадает позиция в дереве окон?
Позиция попадает в
findwnd, а
varset запоминает уже найденное окно с заданной позицией.
Добавлено: Вт дек 06, 2016 17:57
Flasher
MVV писал(а):Собственно, после возврата из функции (после подъёма на уровень вверх) её переменные уже не нужны и могут быть переиспользованы.
Какая связь у переиспользования с глубиной?
MVV писал(а):А что такое порядковый номер?
Номер элемента окна в порядке следования в дереве.
MVV писал(а):Позиция попадает в findwnd, а varset запоминает уже найденное окно с заданной позицией.
Позиция? Туда разве не дескриптор попадает, если верить справке?
Добавлено: Вт дек 06, 2016 18:52
MVV
Какая связь у переиспользования с глубиной?
Стандартный стек: переменные выделяются на стеке, а по выходу из функции на их месте выделяются переменные следующей запущенной функции.
Номер элемента окна в порядке следования в дереве.
Как-то ты смешал
@lvl и индексы окон... Это совершенно разные вещи.
Позиция? Туда разве не дескриптор попадает, если верить справке?
В твоём примере вычисляется
findwnd(TMyComboBox, , , 0, 1), и затем результат записывается в ячейку памяти TCFS2 с индексом
@lvl. Позиция в дереве окон здесь - параметр функции
findwnd. А номер ячейки памяти задаётся псевдопеременной
@lvl.
Добавлено: Вт янв 10, 2017 08:46
Flasher
MVV
А с диалогом
Открыть что-то можно придумать?:
Код: Выделить всё
/ef "tcm(2032,1) eval(settext_wait(`C:\List.txt`, findwnd(ComboBox,,,0,1)))"
/ef "tcm(2032,1) eval(settext_wait(`C:\List.txt`, findwnd(ComboBox,,findwnd(#32770),0,1)))"
MVV писал(а):И что насчёт установки фокуса?
Терпение, мой друг, терпение.

Долго терпеть-то?
Для чекбоксов и радиокнопок обнова требуется, или силами msg решаемо?
+ Есть пожелание: если в findwnd вместо класса пишем
A (@,#,$ - не суть), то берётся класс окна на переднем плане.
Добавлено: Вт янв 10, 2017 12:26
MVV
Flasher писал(а):А с диалогом
Открыть что-то можно придумать?:
Код: Выделить всё
/ef "tcm(2032,1) eval(settext_wait(`C:\List.txt`, findwnd(ComboBox,,,0,1)))"
/ef "tcm(2032,1) eval(settext_wait(`C:\List.txt`, findwnd(ComboBox,,findwnd(#32770),0,1)))"
Здесь у меня сработал такой вариант:
Код: Выделить всё
TCFS2 /ef "tcm(2032,1) delay(1000) eval(settext_wait(`C:\List.txt`, findwnd(Edit,,findwnd(ComboBox,,findwnd(#32770),0,1))))"
Не знаю, почему без задержки не работает, возможно, само окно устанавливает пустой текст полю ввода уже после TCFS2. Также не совсем понимаю, почему сам комбобокс игнорирует сообщение
WM_SETTEXT.
Flasher писал(а):Долго терпеть-то?

Если терпеть, то долго... Забыл я про TCFS2, постараюсь на днях сделать.
Flasher писал(а):Для чекбоксов и радиокнопок обнова требуется, или силами msg решаемо?
Какая обнова?
Flasher писал(а):+ Есть пожелание: если в findwnd вместо класса пишем A (@,#,$ - не суть), то берётся класс окна на переднем плане.
Да собственно для этого достаточно простого
findwnd(), что легко проверить с помощью команды:
Код: Выделить всё
TCFS2 /ef delay(2000) /ei "settext(findwnd())"
При этом в течение этих двух секунд можно открыть произвольный диалог тотала и потом найти вовращаемый дескриптор окна в дереве окон процесса. Однако беда в том, что на самом переднем плане почему-то оказываются окна с классом
Auto-Suggest Dropdown (скрытые вспомогательные окна) - они идут первыми по Z-порядку... Можно, конечно, пропускать скрытые окна, если
findwnd запускается вообще без параметров (хотя лучше наверное флаг завести для пропуска невидимых окон).
Добавлено: Вт янв 10, 2017 13:00
Flasher
MVV писал(а):Здесь у меня сработал такой вариант:
У меня не срабатывает. Если к ComboBox дописываю Ex32, то работает с задержкой 100.
MVV писал(а):Также не совсем понимаю, почему сам комбобокс игнорирует сообщение WM_SETTEXT.
А это может быть связано с тем, что это системное окно, а не ТС?
MVV писал(а):постараюсь на днях сделать.
Гуд.
MVV писал(а):Какая обнова?
Нововведение.
MVV писал(а):хотя лучше наверное флаг завести для пропуска невидимых окон
Лучше их в автоматический игнор ставить.
Добавлено: Вт янв 10, 2017 13:08
MVV
А это может быть связано с тем, что это системное окно, а не ТС?
Скорее, компонент хитрый. Если слать сообщение верхнему
ComboBoxEx32, то работает. А если среднему
ComboBox - нет.
Нововведение.
Которое из?
Лучше их в автоматический игнор ставить.
Совсем игнорить их нельзя. Я могу захотеть найти скрытый чекбокс и включить его.
Добавлено: Вт янв 10, 2017 13:18
Flasher
MVV писал(а):Если слать сообщение верхнему ComboBoxEx32, то работает. А если среднему ComboBox - нет.
Так у тебя же в команде как раз средний. Да и всё равно без задержки никак. И на x64 системе/ТС класс тот же?
MVV писал(а):Которое из?
Оба.

Обновление с двумя нововведениями (отметкой чекбокса и радиокнопки).
MVV писал(а):Я могу захотеть найти скрытый чекбокс и включить его.
Понятно. Пусть будет флаг.
Добавлено: Вт янв 10, 2017 14:29
MVV
Так у тебя же в команде как раз средний. Да и всё равно без задержки никак. И на x64 системе/ТС класс тот же?
Корпоративная Win7x64 с обновлениями. Оно по идее должно только от версии системной библиотеки зависеть и от используемого класса (Проводник как всегда впереди планеты всей, ему мало ComboBox, ему надо ComboBoxEx32, на который я документации не вижу).
Обновление с двумя нововведениями (отметкой чекбокса и радиокнопки).
Фух, понял. Радиокнопке достаточно послать
BM_CLICK ($F5) для активации, а чекбоксу -
BM_SETCHECK ($F1) с новым состоянием в
wParam: 0 - снять, 1 - установить, 2 - затемнить. Хоть вчера.

Добавлено: Вт янв 10, 2017 22:13
MVV
Собственно,
TCFS2Tools Build 220:
+ команды для получения и установки фокуса компонентов окон
Можно узнать дескриптор активного поля ввода/чекбокса/выпадающего списка и т.п. Можно переключить фокус, например, с диалога копирования на поле ввода кодировки в листере.
Играем:
Код: Выделить всё
TCFS2 /ef delay(2000) /ei "settext(`focus: ` msg($433, 65557))"
TCFS2 /ef delay(2000) /ef "msg($433, 65558, 1050700)"
Успел заметить, что с окнами BTM (ДФП) не работает (возможно, они работают в другом потоке).
Добавлено: Вт янв 10, 2017 22:37
Flasher
MVV
Вот спасибо!

Правда, хотелось, чтобы определение активного окна/контрола было в самой TCFS2.
В первом примере запятой нет.
Во втором 1050700 - это что?
Добавлено: Вт янв 10, 2017 23:23
MVV
В самой TCFS2 невозможно, т.к. это работает только в пределах процесса.
Читай в Readme описание синтаксиса, всё ж описано.

Первый пример - получение фокуса, второй пример - установка (после запятой - тестовый дескриптор окна).
Добавлено: Вт янв 10, 2017 23:37
Flasher
Получение фокуса не срабатывает. Нажал, перешёл в комстроку - тихо.
Про 1050700 ReadMe молчит.