TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

sa писал(а):Что-то не то у меня с кнопкой, использующей loop: кнопка перестаёт срабатывать, если я переключаюсь во время её работы на другое окно (приложение).
Думаю, это происходит потому, что получать нажатия клавиш может только активное окно, а искомое окно при переключении на другое приложение активным, само собой, не является.

Не думаю, что можно что-то с этим сделать. В винде немало средств для переключения фокуса и целая система условий, при которых оно не выполняется. То и дело сталкиваюсь с тем, что ненужные окна выскакивают на передний план и перехватывают фокус в неподходящий момент, в то время как нужные в нужные мне моменты этого сделать не могут.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

MVV
А вот при использовании макроса с рекурсией фокус не теряется (правда постоянно происходит возврат к окну TC из других окон) и кнопка срабатывает.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

У тебя в случае рекурсии все вложенные wait_for_s гарантированно запускаются, пока в очередной не сработает ветка выхода. А в случае цикла, как только ты переключаешься на другое окно, send возвращает -1, которая в сумме с 1 от delay даёт 0, прерывающий цикл. Домножай send на 0 или вообще сделай, как с рекурсией: 0*send()*delay(1000)+1.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Спасибо! В самом деле, предложенный тобой вариант обеспечивает непрерывающийся цикл при попытке переключения на другое окно:

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef "tcm(501,1) delay(200) send(`{BKSP}^{TAB}~(%ш%o){TAB 2}{UP}{ENTER}`, findwnd(`TFindFile`)) loop(@<=120 && if(findwnd(`TFindFile`)==0, 0, 0*send(`~(%л%l)`, findwnd(`TFindFile`))*delay(1000)+1))
if(findwnd(`TFindFile`)==0, tcm(278,1))"
WCMICONS.DLL,47
Поиск файлов/каталогов не старше 1 часа с выводом на панель и переходом в краткий режим


-1
При этом время, отведённое на поиск, в другом окне скоротать не получится…
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Попробовал, получилось вручную послать сообщения, чтобы имитировать Alt+0 (у меня к наиболее нужным кнопкам и опциям в окне поиска можно обращаться по Alt+1, Alt+2, ..., что позволяет пользоваться ими при любой раскладке клавиатуры: к полям ввода, к опциям RegEx, кнопкам внизу окна):

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

sendmsg(findwnd(`TFindFile`), $104, $12, $1, 1) sendmsg(findwnd(`TFindFile`), $104, $30, $1, 1)
Этот способ работает и при неактивном окне.

Сообщения перехватил с помощью Spy++, оба сообщения - WM_SYSKEYDOWN ($104): lParam - виртуальный код, и обязательно через PostMessage: сперва Alt (VK_MENU=$12), затем клавиша 0 (VK_0=$30). Такие сообщения на другой раскладке будут посылать другие буквы.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Способ работает. Пробовал и с русской раскладкой для русскоязычного меню. Вместо клавиши 0 ($30) посылал K ($4B). Жаль, что способ зависим от раскладки, либо требует переделки LNG-файла: так радовало, что эту проблему удалось решить в функции send.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Если бы не дельфи, идентификаторы кнопок бы не изменялись при каждом новом открытии диалога, и достаточно было бы единственного WM_COMMAND, чтобы послать нажатие любой кнопки окна...
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Кнопка, работающая и при неактивном окне TC:

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef "tcm(501,1) delay(200) send(`{BKSP}^{TAB}~(%%ш%%o){TAB 2}{UP}{ENTER}`, findwnd(`TFindFile`)) loop(@<=120 && if(findwnd(`TFindFile`)==0, 0, 0*sendmsg(findwnd(`TFindFile`), $104, $12, $1, 1)*sendmsg(findwnd(`TFindFile`), $104, $30, $1, 1)*delay(1000)+1)) if(findwnd(`TFindFile`)==0, tcm(301,1))"
WCMICONS.DLL,47
Поиск файлов/каталогов не старше 1 часа с выводом на панель по Alt+0 и переходом в краткий режим


-1
Требует переназначения на Alt+0 вывода файлов на панель в окне поиска для независимости от раскладки клавиатуры.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

sa писал(а):Требует переназначения на Alt+0 вывода файлов на панель в окне поиска для независимости от раскладки клавиатуры
... путём правки строки 5664 LNG-файла. Я лично добавляю в конец надписи ", &0".
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

А в середине строки в слове “Фай&лы” соответственно & надо убрать.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

В общем случае, если бы TC воспринимал не одно значение акселератора, а два, то необходимость смены раскладки в диалогах (в том числе и в избранных каталогах) не была бы такой острой: например опцию вывода файлов на панель после поиска можно было бы желающим записать в виде Фай&лы на панель (&k).
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

sa,
Шорткаты обрабатываются не тоталом, а оконной подсистемой Windows (которая и реагирует на них, и заменяет & на _ при отрисовке).
Не надо путать их с акселераторами - это ещё одно средство оконной подсистемы Windows, позволяющее назначать командам комбинации клавиш (дельфи этот инструмент не использует).
Последний раз редактировалось MVV Чт ноя 28, 2013 16:27, всего редактировалось 1 раз.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

MVV писал(а):Шорткаты обрабатываются не тоталом, а оконной подсистемой Windows
Понятно. Жаль!
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Вариант предыдущей кнопки, но с вызовом шаблона поиска с именем “Файлы не старше 1 часа”:

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef "set_ini(`%COMMANDER_PATH%\usercmd.ini`, em_temp, cmd,
`LOADSEARCH Файлы не старше 1 часа`) tem(em_temp) delay(200) send(`{ENTER}`, findwnd(`TFindFile`)) loop(@<=120 && if(findwnd(`TFindFile`)==0, 0, 0*sendmsg(findwnd(`TFindFile`), $104, $12, $1, 1)*sendmsg(findwnd(`TFindFile`), $104, $30, $1, 1)*delay(1000)+1)) if(findwnd(`TFindFile`)==0, tcm(301,1))"
WCMICONS.DLL,47
Поиск по шаблону "Файлы не старше 1 часа" с выводом на панель по Alt+0 и переходом в краткий режим


-1
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Команда для смены списка исключений:

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

switch_ignore_list=if(isIgnoreListEnabled, tcm(2922)+set_tcini(Configuration,IgnoreListFile,#1)+tcm(2922), set_tcini(Configuration,IgnoreListFile,#1))				; Сменить список исключений (если опция была включена, она будет включена после смены списка)
Макрос:

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

isIgnoreListEnabled=tcini(Configuration, IgnoreListFileEnabled, 1, 1)
Вызов:

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

TCFS2.exe /ei "switch_ignore_list(`C:\ignore_list.txt`)"
Ответить