View previous topic :: View next topic |
Author |
Message |
yahuu
Joined: 22 Jun 2023 Posts: 34
|
(Separately) Posted: Tue Jul 29, 2025 11:59 Post subject: |
|
|
Orion9 wrote: |
Да, в AHK есть примеры, как сделать обработку двойного или даже тройного нажатия клавиш, но и в Autorun можно сделать что-то похожее. Самый простой пример:
Code: | SetHotkeyAction /H:F12 F12DoublePress
Func F12DoublePress()
Static t1 = 0
If (GetUptime() - t1) < 300 Then
ShowHint("F12 double pressed")
EndIf
t1 = GetUptime()
EndFunc
|
В примере не учитывается обработка одиночного нажатия, но если она нужна, то её можно добавить.
|
Спасибо, что предложили временное решение проблемы. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 406
|
(Separately) Posted: Mon Aug 04, 2025 19:28 Post subject: |
|
|
Оба варианта не работают: Code: | FileCopy("c:\PortablePrograms\FileManagers\TotalCommanderPortable\Plugins\wlx\TC1by1\rus\1by1.exe", "c:\PortablePrograms\FileManagers\TotalCommanderPortable\Plugins\wlx\TC1by1\1by1", 1)
FileCopy(COMMANDER_PATH & "\Plugins\wlx\TC1by1\eng", COMMANDER_PATH & "\Plugins\wlx\TC1by1\1by1", 1) |
Что я опять не так делаю? |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1579
|
(Separately) Posted: Tue Aug 05, 2025 11:33 Post subject: |
|
|
AkulaBig
В первом случае непонятно, 1by1 на конце целевого пути - это существующий каталог или имя файла? Если имя файла, то у меня работает, а если имя каталога - то действительно, что-то не копируется. Что очень странно, такой сценарий точно тестировался.
Во втором - eng и 1by1 это же скорее всего каталоги? Тогда надо использовать DirCopy. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 406
|
(Separately) Posted: Tue Aug 05, 2025 14:43 Post subject: |
|
|
Loopback wrote: | Если имя файла, то у меня работает, а если имя каталога - то действительно, что-то не копируется |
Имя каталога. Ибо:
Code: | dest Полный путь к целевому файлу или каталогу. |
То-есть в справке написано, что можно использовать целевой каталог. Вроде команда copy винды так и работает. По крайней мере через COMSPEC все работает. Не думал, что надо имя файла указывать.
Loopback wrote: | Во втором - eng и 1by1 это же скорее всего каталоги? Тогда надо использовать DirCopy. |
Ну я опять-же прочитал:
Code: | При указании каталога без маски будут скопированы все файлы, находящиеся в нём. |
Интересно. Что тогда в целевом каталоге надо прописывать, если в нем необходимо прописывать имена файлов?
Я конечно вас понял. Новые команды, синтаксис пока не обкатан. Не знаю, ошибка это или нет. Вы меня знаете, мне и так сойдет. Лишь-бы работало. Думаю вы сами примете решение, ошибка это или нет. Я думаю, как минимум, если синтаксис отличается от стандартного, примеры привести-бы. А то там пример не дает представление, какой синтаксис правильный.
Добавлено спустя 2 часа 32 минуты:
Вот сейчас переделал копирование через DirCopy. Все отлично работает и понятно. Может тогда убрать не совсем понятные опции FileCopy и оставить возможность только одиночного копирования файла? Единственное, чтобы целевой каталог можно было-бы задавать без имени файла. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1579
|
(Separately) Posted: Tue Aug 05, 2025 20:54 Post subject: |
|
|
AkulaBig wrote: | То-есть в справке написано, что можно использовать целевой каталог. |
Можно, конечно, иначе бы смысла не было. Но как раз с этим сценарием и была проблема, странно, как она просочилась в релиз. Исправил.
AkulaBig wrote: | Ну я опять-же прочитал: |
Это мой косяк, забываю уже. Разумеется, просто каталог передавать тоже можно. Не работало по той же причине.
AkulaBig wrote: | Новые команды, синтаксис пока не обкатан. Не знаю, ошибка это или нет. |
Именно так, получается, это первые тесты "со стороны", больше никто проблему не репортил. Это ошибка, конечно.
AkulaBig wrote: | Может тогда убрать не совсем понятные опции FileCopy и оставить возможность только одиночного копирования файла? |
Думаю не стоит. DirCopy копирует рекурсивно с подкаталогами, это не всегда требуется. А FileCopy по такому же принципу работает в Autoit/AHK, я ориентировался на них. Хотя примеры разных сценариев нужны, тут спорить не о чем.
В общем, исправил, попробуйте эту версию.
Версия 05.08.2025
Code: |
- исправлено копирование файлов в существующий каталог с FileCopy
- исправлена установка размера буфера в параметрах DllCall (регресс с версии 2.2.17)
|
|
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 406
|
(Separately) Posted: Tue Aug 05, 2025 21:31 Post subject: |
|
|
Loopback
Потестю. А сейчас новый вопрос. Что-то поиском не нашел TextFile.
Code: | Local txt_SumatraPDF = COMMANDER_PATH & "\Plugins\wlx\TCSumatraPDF\SumatraPDF\SumatraPDF-settings.txt"
Local LangSumatraPDF = TextFile(txt_SumatraPDF, rw)
Local UiLang
LangSumatraPDF.Begin()
While Not LangSumatraPDF.AtEOF
UiLang = obj.ReadLine()
OutputDebugString(UiLang)
Wend |
Почему вот это не работает?
Loopback wrote: | DirCopy копирует рекурсивно с подкаталогами, это не всегда требуется. |
С этим полностью согласен.
Добавлено спустя 9 минут:
Протестировал FileCopy. Все отлично работает. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1579
|
(Separately) Posted: Tue Aug 05, 2025 21:45 Post subject: |
|
|
AkulaBig wrote: | Почему вот это не работает? |
Если исправить две очевидные ошибки - rw должно быть в кавычках и obj.ReadLine() -> LangSumatraPDF.ReadLine(), то всё читается.
Видимо, вы пользуетесь версией x64, где проблему с автозакрытием окна ошибки полностью так и не удалось решить. Поскольку на этих ошибках вываливается сообщение, чётко указывающее причину. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 406
|
(Separately) Posted: Tue Aug 05, 2025 22:13 Post subject: |
|
|
Loopback wrote: | obj.ReadLine() -> LangSumatraPDF.ReadLine() |
Блин, какой глупый косяк. Все заработало. Но окна ошибки нет ни в 32, ни в 64 ТС. Очень странно. Я-бы тогда и не спрашивал.
А с окном ошибки я вопрос легко решаю. Но решение не для этого форума. Приходится в загашнике держать нужный файлик.
Добавлено спустя 42 минуты:
Я специально легкий вопрос про ошибку задал. Чтобы немножечко размять ваши мозги
А теперь серьезный вопрос. Ну вот такой код работает. Но конечно-же записывает значение в конец файла. А мне надо заменить существующее значение. Можно-ли это сделать в рамках объекта TextFile? У метода WriteLine нет свойства - номер строки.
Code: |
Local LangSumatraPDF = TextFile(txt_SumatraPDF, "rw")
Local UiLang
LangSumatraPDF.Begin()
While Not LangSumatraPDF.AtEOF
UiLang = LangSumatraPDF.ReadLine()
If StrPos(UiLang, "UiLanguage") > 0 Then
LangSumatraPDF.WriteLine("UiLanguage = en")
Endif
Wend
|
|
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1579
|
(Separately) Posted: Wed Aug 06, 2025 00:06 Post subject: |
|
|
AkulaBig wrote: | Очень странно. |
Более чем, у меня обе ошибки выдавало.
AkulaBig wrote: | Можно-ли это сделать в рамках объекта TextFile? |
Тут не совсем правильно то, что добавляется в конец файла, должно записаться сразу за строкой, где найдено UiLanguage. Впрочем есть догадка почему, потом посмотрю.
Но такой сценарий - найти что-то в строке и изменить только эту строку, не получится. К сожалению, таких вольностей в произвольной записи, как с бинарными файлами, текст не позволяет. Даже если сделать возможность возврата на начало только что прочитанной строки, при записи строки большего размера она наложится на следующую строку, а если меньшего - создаст еще строку. Воткнуть такую строку корректно без перезаписи всего файла невозможно.
В любом случае использовать объект для файлика в пару килобайт - это как из пушки по воробьям. Целесообразнее прочитать его целиком и работать в памяти. Конкретно для этой задачи проще всего будет использовать List:
Code: |
Local txt_SumatraPDF = COMMANDER_PATH & "\Plugins\wlx\TCSumatraPDF\SumatraPDF\SumatraPDF-settings.txt"
Local lst = List()
lst.LoadFromFile(txt_SumatraPDF)
For i = 0 to lst.Count-1
If StrPos(lst[i], "UiLanguage") > 0 Then
lst[i] = "UiLanguage = en"
Break
Endif
Next
lst.SaveToFile(txt_SumatraPDF)
Free(lst)
|
|
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 406
|
(Separately) Posted: Wed Aug 06, 2025 05:33 Post subject: |
|
|
Loopback wrote: | Более чем, у меня обе ошибки выдавало. |
Очень интересно. Пришлось поковыряться, но проблему все-же нашел. Оказывается, начиная с какой-то строки кода перестает выводиться нормальное сообщение об ошибке. То-есть написал я строке 111. Появилось сообщение об ошибке. Написал 111 на 15-20 строк ниже. Окно сообщения об ошибке стало появляться в верхнем левом углу экрана, причем за пределами экрана:
Так как я работаю с распахнутым окном ТС, я это сообщение не заметил сразу. Причем в ТС32 даже этого огрызка не видно. Похоже сообщение полностью уходит за границы экрана.
Loopback wrote: | Конкретно для этой задачи проще всего будет использовать List |
Спасибо, я так и подумал. Некоторый опыт работы с текстовым файлом через List и через Dll у меня есть. С вашим кодом разберусь. Просто хотелось попробовать новый функционал. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1579
|
(Separately) Posted: Wed Aug 06, 2025 12:54 Post subject: |
|
|
AkulaBig wrote: | Окно сообщения об ошибке стало появляться в верхнем левом углу экрана, причем за пределами экрана: |
А вот это уже интересно. Похоже баг именно нового окна ошибки. Вероятно, связано с кодом позиционирования, который пытается расположить окно по центру окна TC. Но возможно, в момент его выполнения окно TC находится не в той позиции, где нужно. И остается непонятна зависимость от строчки кода, тут скорее все же какие-то другие факторы.
В любом случае у себя так и не смог повторить. Сделал отладочную версию, c выводом в DebugView, можете глянуть у себя, какие получаются координаты окон в момент возникновения проблемы?
AkulaBig wrote: | Просто хотелось попробовать новый функционал. |
Понятно, но для всего свои инструменты. Для этой задачи объект не подходит. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 406
|
(Separately) Posted: Wed Aug 06, 2025 17:21 Post subject: |
|
|
Loopback wrote: | какие получаются координаты окон в момент возникновения проблемы? |
Ну точно. Координаты минусовые:
А вот когда окно ошибки видно:
Вот сама ошибка:
Странная проблема. Раньше при правильном расположении окно было видно пока не нажмешь кнопку. Я имею ввиду если не появляется наг-скрин. А сейчас я его только гифкой поймал. Оно показывается и быстро исчезает. Это не с тестовой версией плагина, а уже до этого. Сейчас проверю на оф версии.
Loopback wrote: | Понятно, но для всего свои инструменты. Для этой задачи объект не подходит. |
Буду знать.
Добавлено спустя 10 минут:
Блин. 2.2.1 у меня уже не работает. А 2.2.1.19.1 также работает. Не могу проверить. Именно это окно исчезает или на всех ошибках. Все забываю написать. ТС и 32 и 64. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1579
|
(Separately) Posted: Wed Aug 06, 2025 20:42 Post subject: |
|
|
AkulaBig wrote: | Ну точно. Координаты минусовые |
Очень интересные координаты у окна тотала. Ничего удивительного, что диалог появляется где-то за экраном. В общем ясно, что центрировать относительно окна тотала можно не всегда, в таких вот пограничных состояниях надо выравнивать по центру экрана. Осталось только понять, как такое состояние достоверно отличить от нормального. Не уверен, что прямоугольник всегда будет 1 0 1 0.
Вот что еще подумал, я не проверяю результат GetWindowRect, надо бы убедиться, что функция выполняется без ошибки, ну мало ли, иначе, полагаю, прямоугольник может содержать что-нибудь случайное. Заодно еще пару параметров проверим. Выложил по той же ссылке, проверьте, пожалуйста, еще раз. Достаточно будет только проблемного варианта.
AkulaBig wrote: | Оно показывается и быстро исчезает |
Я не очень понял, что где проявляется, но вроде как проблемы автозакрытия окна никогда на 32-битном тотале не было.
Ох уж эти ковровые блокировки, картинки только через впн удалось увидеть... |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 406
|
(Separately) Posted: Wed Aug 06, 2025 20:58 Post subject: |
|
|
Loopback wrote: | Очень интересные координаты у окна тотала. |
Дак это координаты окна ТС? Странно. Я думал координаты сообщения. Что верно по факту. Окно ТС находится на экране.
Loopback wrote: | проверьте, пожалуйста, |
Сейчас.
Добавлено спустя 16 минут:
Loopback
Я понял про координаты ТС и окна ошибки. Просто до этого не разбирался с результатом. Конечно окно ТС показывает неадекватный результат. Из-за этого ваше окно и уходит за пределы экрана. Сегодня общался с Гислером. Он назвал мой файл странным:
Вот я ввел новый атрибут файла
Координаты тоже СТРАННЫЕ  |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1579
|
(Separately) Posted: Wed Aug 06, 2025 23:09 Post subject: |
|
|
AkulaBig
Ого. Всё даже ещё интереснее. GetWindowRect выполняется с ошибкой (соответственно, координаты неверны), GetLastError даёт ошибку "неверный дескриптор окна". Т.е. как будто полученный ранее хэндл окна тотала - неверный. По строке TCWindow ... Handle видно, что он не нулевой, а значит был чуть ранее успешно получен поиском TTOTAL_CMD. Однако именно в этом месте по этому хэндлу не удается ничего получить - ни координаты, ни класс окна...
Честно говоря, пока не знаю что думать. Конечно, исправить именно эту проблему с диалогом можно, но смущает этот "неверный дескриптор окна", учитывая что это значение используется в огромном количестве мест (в т.ч. переменная AUTORUN_TCHANDLE). Хотя до сих пор никто не жаловался, что её значение невалидное, да и много чего не работало бы.
Кстати, я так понимаю, это такое на обеих разрядностях? И, в случае нормального выполнения, в строке Class: показывается "TTOTAL_CMD"?
Плохо, что у меня не повторяется, даже проверил на виртуалке с Win11, но увы. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|