Страница 65 из 130

Добавлено: Чт фев 28, 2013 18:40
ask-rus
Два вопроса, может ли TCFS2:
1) Переименовать секцию *.INI-файла?
2) Закомментировать ключ *.INI-файла?
:roll:

Добавлено: Чт фев 28, 2013 18:46
Flasher
1. Это видел?
2. Нет.

Добавлено: Чт фев 28, 2013 20:10
ask-rus
Flasher писал(а):1. Это видел?
2. Нет.
На оба вопроса ответ нет, жаль.

А что если это реализовать в доп. модуле типа TCFS2Tools? Задачи специфические, но спросом будут пользоваться определённо.

Добавлено: Пт мар 01, 2013 15:02
MVV
Это потребует передавать параметры-строки. Мне-то добавить функцию, отправляющую очередное сообщение с заданной строкой окну тотала, не сложно, но кто будет писать модуль? :roll:

Добавлено: Вс мар 10, 2013 20:39
MVV
Бета 332.

Добавлена возможность передачи параметров EM-командам:

Код: Выделить всё

TCFS2 /ef "tem(`em_cd c:\`)"
TCFS2 /ef "tem(`em_exec notepad`)"
При этом у самих EM-команд в строке параметров нужно использовать %A.

Также добавлена функция send для отправки нажатий клавиш окнам тотала. Синтаксис - как в функциях SendKeys.Send (C#) и SendKeys (VBS), за парой различий: поддерживаются только самые короткие обозначения клавиш ({BS}, {INS}, {DEL}), часть клавиш я выкинул (всякие непонятные F13+ и HELP), ~ работает как обычная клавиша, а не как ENTER (ENTER можно послать через {ENTER}), ну и {{}/{}} не поддерживаются за ненадобностью (вместо них следует использовать {[}/{]} - эффект тот же, т.к. символы находятся на тех же клавишах). Повтор ({LEFT 20}) тоже работает. Т.е. можно делать так:

Код: Выделить всё

TCFS2 /ef "send(`%(){DOWN}{ENTER}{TAB 2} {ENTER}`)
TCFS2 /ef "send(`notepad ^+{ENTER}{ENTER}`)"
Если во время отправки нажатий активировать другое окно, клавиши получит оно. :D

Добавлено: Пн мар 11, 2013 07:24
ask-rus
А какое значение между нажатиями в мс? Можно ли увеличивать/уменьшать его?

Добавлено: Пн мар 11, 2013 09:51
MVV
На данный момент - никакого. Нажатия просто отправляются, ну а там система помещает их в очередь сообщений активного окна, и дальнейшая обработка уже зависит от тотала. Особого смысла пока в задержке не вижу (объясните, если он есть), разве что в разовых паузах (надо подумать, как их добавить - как вариант, что-то типа {WAIT 400}).

Добавлено: Пн мар 11, 2013 12:27
Flasher
О, дождались! :D Спасибо! И не нужны никакие tcimg и подобные грузомонстры.
Даже параметры - сильно! MVV, а к cm_ будут?

А под окнами подразумеваются все без исключения или только диалоги ТС?
MVV писал(а):Если во время отправки нажатий активировать другое окно, клавиши получит оно.
Плохо. А можешь сделать ограничение по классу (как AutoHotKey)?
MVV писал(а):Особого смысла пока в задержке не вижу
Я тоже не вижу. Задержка и так есть - delay.

Добавлено: Пн мар 11, 2013 17:03
MVV
CM-команды не поддерживают передачу параметров по определению. Да и EM-команды их поддерживают не настолько хорошо, как хотелось бы - только ANSI.
А под окнами подразумеваются все без исключения или только диалоги ТС?
Система эмулирует нажатия клавиш, при этом ловит их активное окно. Перед началом эмуляции (в начале каждого вызова send) я делаю окно тотала активным. Если в тотале открыто модальное окно, нажатия получит оно (диалоги установки атрибутов, копирования и т.п., которые блокируют окно тотала).
Плохо. А можешь сделать ограничение по классу (как AutoHotKey)?
Мне объясняй подробнее, понятия не имею, как оно в AHK. Я и так окно тотала активирую перед началом передачи, так что всё должно быть в порядке, если не переключаться между окнами во время каждого вызова send (что по идее не так-то и просто, т.к. символы посылаются быстро).
Я тоже не вижу. Задержка и так есть - delay.
Кстати, да, можно же так её делать.

Код: Выделить всё

TCFS2 /ef "send(`%(){DOWN}{ENTER}`) + delay(100) + send(`{TAB 2} {ENTER}`)"

Добавлено: Пн мар 11, 2013 17:23
Flasher
MVV писал(а):CM-команды не поддерживают передачу параметров по определению.
Имелись в виду эти. Одна таки есть - cm_List.
MVV писал(а):Мне объясняй подробнее, понятия не имею, как оно в AHK.
Пример директивы: #IfWinActive ahk_class TPanel

Добавлено: Пн мар 11, 2013 18:28
MVV
Имелись в виду эти. Одна таки есть - cm_List.
Думаю, она обрабатывается нестандартно. Обычные CM-команды - это просто сообщения с номерами, строки так передать невозможно (разве что в пределах одного процесса). Если она уж очень нужна, могу предложить сделать EM-команду с TOTALCMD /S=L %A.
Пример директивы: #IfWinActive ahk_class TPanel
Из внешнего процесса невозможно узнать, какое дочернее окно тотала имеет фокус ввода (только внедрением DLL). Проверить можно лишь окна верхнего уровня. Но после активации окна придется еще ждать, пока оно активируется, и проверять, совпадает ли класс. Или разбить активацию окна и отправку нажатий на разные функции, тогда можно добавить функцию проверки класса и/или текста текущего окна (опять же, верхнего уровня).

Добавлено: Пн мар 11, 2013 19:46
Flasher
MVV писал(а):Если она уж очень нужна
Я не только имел в виду эту команду, но и другие по ссылке.
MVV писал(а):Но после активации окна придется еще ждать, пока оно активируется
Это как?
MVV писал(а):Или разбить активацию окна и отправку нажатий на разные функции, тогда можно добавить функцию проверки класса и/или текста текущего окна
Разбиение будет предполагать увеличение записей в синтаксисе. Лучше объединённую с проверкой класса (с заголовком теряется универсальность).

Добавлено: Пн мар 11, 2013 20:00
MVV
Я не только имел в виду эту команду, но и другие по ссылке.
Те команды с параметрами вообще идут особняком. В totalcmd.inc специально написано, что они снабжены номерами исключительно для локализации.
Сейчас создал em_SyncOpen с командой SYNCOPEN и параметром %A, она в состоянии загружать шаблоны.

Код: Выделить всё

TCFS2.exe /ef "tem(`em_SyncOpen ИмяШаблона`)"
Это как?
Имелось в виду после отправки команды активации. Я не знаю, возвращает ли управление функция до того, как окно действительно получает фокус.
Лучше объединённую с проверкой класса
Толку с проверки класса? В AHK эта проверка внешняя и действует для целого куска скрипта, логично было бы и здесь отдельной функцией проверять класс активного окна (но если тотал вообще неактивен, то и класс будет вообще не тотальный). Но у нас всего одна функция send, которой не всё равно, какое окно активно (остальные работают не с активным окном, а с самим окном тотала, даже если оно неактивно), и я не вижу логичного способа добавления параметра класса.
Да и не все окна можно однозначно опознать по классу (а-ля TCx64, где сплошь и рядом Window - впрочем, все равно узнать, какое из дочерних окон активно, все равно нельзя).

Добавлено: Вт мар 12, 2013 00:06
Flasher
MVV писал(а):Сейчас создал em_SyncOpen с командой SYNCOPEN и параметром %A, она в состоянии загружать шаблоны.
Да кто бы сомневался. Хотелось как раз таки обойти задействование em.
MVV писал(а):Я не знаю, возвращает ли управление функция до того, как окно действительно получает фокус.
А проверить? :)
MVV писал(а):В AHK эта проверка внешняя и действует для целого куска скрипта
Директива для всего скрипта. Но можно делать и для куска.
MVV писал(а):но если тотал вообще неактивен, то и класс будет вообще не тотальный
А TCFS2 какая разница, он же за пределами ТС не работает?
MVV писал(а):Но у нас всего одна функция send, которой не всё равно, какое окно активно
Отсюда поподробней. На чём стоят ограничения?
MVV писал(а):остальные работают не с активным окном, а с самим окном тотала, даже если оно неактивно
Да, это я знаю.
MVV писал(а):и я не вижу логичного способа добавления параметра класса
Смотря что ты понимаешь под нелогичным.
MVV писал(а):впрочем, все равно узнать, какое из дочерних окон активно, все равно нельзя
Можно узнавать какое активно в момент отправки команды и фиксировать до хэндлу.

Добавлено: Вт мар 12, 2013 00:44
MVV
Да кто бы сомневался. Хотелось как раз таки обойти задействование em.
Пока никак. А с учетом того, что таких команд всего десяток, вообще не вижу проблемы.
Директива для всего скрипта. Но можно делать и для куска.
Не думаю, что AHK более 1 раза сверяет класс окна. Скорее всего, проверяет вначале, а потом работает с этим хэндлом. Но send работает без хэндла, поэтому сначала надо активировать тотал.
А TCFS2 какая разница, он же за пределами ТС не работает?
Раньше не работала. Но send может, поэтому она активирует окно тотала (но делать это перед отправкой каждого нажатия считаю излишним).
Отсюда поподробней. На чём стоят ограничения?
Ну как, ограничение в том, что если будет активно не окно тотала, нажатия получит неизвестно кто.
Смотря что ты понимаешь под нелогичным.
Добавление проверки активного класса для одной единственной функции.
Можно узнавать какое активно в момент отправки команды и фиксировать до хэндлу.
Я могу узнать, какое окно активно, но какой его контрол (твоим языком говоря) имеет фокус, не могу. В частности, TPanel - это скорее контрол (контрол-контейнер), чем окно (контролы - это дочерние окна, элементы других окон).
И на данный момент все функции TCFS2 работают только с одни хэндлом окна - главного окна тотала. Его получение производится 1 раз - при инициализации TCFS2.