Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Autorun
Goto page Previous  1, 2, 3 ... 193, 194, 195, 196  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
AkulaBig



Joined: 03 Dec 2008
Posts: 406

Post (Separately) Posted: Mon Jul 21, 2025 13:49    Post subject: Reply with quote

Loopback wrote:
То что не работает - это баг, регресс с версии 2.2.17.

Понятно. Тогда будем ждать исправлений. Так-то такая запись и по моему мнению более правильная, чем буфер гонять.
Back to top
View user's profile Send private message
yahuu



Joined: 22 Jun 2023
Posts: 34

Post (Separately) Posted: Tue Jul 22, 2025 06:22    Post subject: Reply with quote

Loopback wrote:

yahuu wrote:
Можно ли добавить функцию двойного щелчка в SetHotkeyAction?

Наверно имелось в виду ControlSetMouseAction? В любом случае, к сожалению, нет. Есть технические сложности.


Нет, я ожидаю, что у SetHotkeyAction будет функция двойного щелчка, например, двойной щелчок по цифровой клавише для выполнения какой-либо команды cm_ или em_.

Если это невозможно реализовать, придется использовать AHK.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1579

Post (Separately) Posted: Tue Jul 22, 2025 12:12    Post subject: Reply with quote

yahuu
Теперь понял. Для обработки двойного нажатия клавиши требуется другой принцип, в отличие от использованного в SetHotkeyAction. Сомневаюсь, что удастся такое реализовать в рамках SetHotkeyAction, но посмотрю.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 797

Post (Separately) Posted: Sat Jul 26, 2025 13:59    Post subject: Reply with quote

yahuu wrote:
Если это невозможно реализовать, придется использовать AHK.

Да, в 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

В примере не учитывается обработка одиночного нажатия, но если она нужна, то её можно добавить.

Loopback
К сожалению, дел ещё по горло и времени на Autorun и на ТС пока нет, но все-таки посмотрел флаг DT_CALCRECT в функции DrawText, как обещал. Заморочек там много, и вряд ли они стоят того, чтобы с ними разбираться. Может быть, вы внесёте изменения в ShowHint и сделаете возможность менять содержимое посказки и другие параметры без вызова новой подсказки? Например, брать хэндл не из макроса LAST_HINT_WINDOW, а от самой функции ShowHint и возвращаемого ей значения. А все остальные операции с подсказкой делать через этот хэндл, включаяя изменение стиля и текста, если требуется.

Ещё одна давняя проблема. На нижней функциональной кнопке "Выход" у меня висит две функции:
Code:
ControlSetMouseAction /L /B:7 17 AutorunStatus
ControlSetHint /F /D:50 /B:7 17 "AutorunHints"

Одна для вызова меню по клику, другая для вызова подсказки по наведению указателя мыши. Если навести мышь на кнопку и нажать до появления подсказки над ней, то ТС очень часто валится. Если нажимать после появления подсказки - то никогда. Вероятно, это связано с тем, что при наведении указателя на кнопку происходит запуск функции ControlSetHint, которая не успев отработать до конца перекрывается вызовом ControlSetMouseAction. Можно как-то решить проблему?

А по поводу Гислера... Ну что тут можно сказать. Меня его смешные и нелепые отмазки не устраивают, и это касается не только drag'n'drop на панелях. Как было отмечено в оригинальном топике, для тех, у кого много кнопок на главной панели, эта фича просто маст-хэв. Я уж не говорю, что совсем не лишним было бы перетаскивание кнопок с панели на панель, например с вертикальной на горизонтальную и наоборот.

AkulaBig wrote:
Наконец-то я закончил переделку сборки на многоязычную. 2202 строки кода на Autorun.

Рад, что дела у вас не стоят на месте. Когда я полность освобожусь, то обязательно посмотрю последнюю версию вашей сборки.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 406

Post (Separately) Posted: Sat Jul 26, 2025 16:51    Post subject: Reply with quote

Orion9 wrote:
А по поводу Гислера... Ну что тут можно сказать. Меня его смешные и нелепые отмазки не устраивают

Кода у вас появится время, прочтите на оффоруме (если к тому времени тема не пропадет) мою тему про косяки перевода. Меня многие поддержали и обосновали намного лучше меня. Ответ Гислера гениален - я не буду ничего переделывать Laughing
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 797

Post (Separately) Posted: Sat Jul 26, 2025 20:13    Post subject: Reply with quote

AkulaBig
Ну, это хотя бы честный ответ, который можно принять и жить дальше. Но зачем водить за нос пользователей несерьёзными аргументами типа "если бы я добавил drag and drop, даже с Shift, была бы большая опасность случайного перетаскивания кнопок". Подобные ответы, кроме смеха и недоумения ничего не вызывают.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1579

Post (Separately) Posted: Sat Jul 26, 2025 22:38    Post subject: Reply with quote

Orion9 wrote:
но и в Autorun можно сделать что-то похожее

Кстати да, вполне себе рабочий вариант. Я как-то в тот момент зациклился на внутренней реализации, а зачем, если всё уже есть.

Orion9 wrote:
К сожалению, дел ещё по горло и времени на Autorun и на ТС пока нет, но все-таки посмотрел флаг DT_CALCRECT в функции DrawText, как обещал. Заморочек там много, и вряд ли они стоят того, чтобы с ними разбираться. Может быть, вы внесёте изменения в ShowHint и сделаете возможность менять содержимое посказки и другие параметры без вызова новой подсказки?

У меня тоже времени не сказать чтобы много.

В принципе нет там каких-то особых заморочек. Потом посмотрю, наверно можно сделать коррекцию размера при получении сообщения WM_SETTEXT, тогда можно будет менять текст с WinSetText.

Orion9 wrote:
Например, брать хэндл не из макроса LAST_HINT_WINDOW, а от самой функции ShowHint и возвращаемого ей значения. А все остальные операции с подсказкой делать через этот хэндл, включаяя изменение стиля и текста, если требуется.

Если бы так было можно, то так и было бы сделано. Но в чём проблема с использованием LAST_HINT_WINDOW?

Стили по хэндлу менять точно нет.

Orion9 wrote:
Можно как-то решить проблему?

Не знаю пока, надо тестировать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 797

Post (Separately) Posted: Sun Jul 27, 2025 00:33    Post subject: Reply with quote

Loopback wrote:
У меня тоже времени не сказать чтобы много.

О срочности речи не было. Да и вообще это не так уж и обязательно. Просто если будет возможность менять текст подсказки без вызова нового окна, это позволит использовать подсказку в виде "висящего табло", в котором содержимое обновляется без мелькания окон.
Loopback wrote:
Но в чём проблема с использованием LAST_HINT_WINDOW?

Немного смутило, что в справке говорится об использовании задержки, если хэндл не возвращается.
Loopback wrote:
Стили по хэндлу менять точно нет.

А вообще это можно как-то сделать на уже отображенной подсказке? Опять же, сугубо факультативно.
Loopback wrote:
Не знаю пока, надо тестировать.

Да вот сделал на скорую руку, думал баг проявится, но нет - ТС ни разу не завалился:
Code:
ControlSetHint /F /D:50 /B:5 17 "F7Hint"

Func F7Hint()
    Return "F7 hint text"
EndFunc

ControlSetMouseAction /L /B:5 17 F7MouseAction

Func F7MouseAction()
     ShowPopupMenu /D /F "CreateF7Menu"
EndFunc

Func CreateF7Menu()
    Local txt
    txt = txt & 'MENUITEM "Menu 1", 10000' & auCRLF         
    txt = txt & 'MENUITEM "Menu 2", 10000' & auCRLF         
    txt = txt & 'MENUITEM "Menu 3", 10000' & auCRLF         
    txt = txt & 'MENUITEM SEPARATOR' & auCRLF
    txt = txt & 'MENUITEM "Settings...", 10000' & auCRLF         
    Return txt
EndFunc

В реальности все сложнее. Я так подозревваю, проблема может быть из-за того, что в обеих функциях у меня используется объект Plugin. Хинт я уже сбрасывал:
 Hidden text

А вот меню так просто сбросить не получится - там много всего лишнего завязано. В общем, как появится больше времени, вернусь к этому.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1579

Post (Separately) Posted: Sun Jul 27, 2025 12:54    Post subject: Reply with quote

Orion9 wrote:
Немного смутило, что в справке говорится об использовании задержки, если хэндл не возвращается.

Если что, речь идет не более чем нескольких десятках миллисекунд. И это ограничение я, кажется, уже устранил.

Orion9 wrote:
А вообще это можно как-то сделать на уже отображенной подсказке? Опять же, сугубо факультативно.

Если всё переписать фактически с нуля - можно, конечно. Просто подсказки вообще не планировались с прицелом на динамическое использование.

Orion9 wrote:
ТС ни разу не завалился

Ну ок, как появится что-то, что можно повторить - вернёмся к этому.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 797

Post (Separately) Posted: Sun Jul 27, 2025 13:21    Post subject: Reply with quote

Loopback wrote:
Если что, речь идет не более чем нескольких десятках миллисекунд. И это ограничение я, кажется, уже устранил.

Это хорошо. А то действительно не совсем понятно было, что с этой задержкой делать. Ведь если не известно, нужна задержа или не нужна, пришлось бы по факту каждый раз её вставлять, чтобы гарантировать получение хэндла.
Loopback wrote:
Если всё переписать фактически с нуля - можно, конечно.

Понял. Не стоит оно того. Не берите в голову. Ну тогда хотя бы текстовое содержимое если будет возможность менять динамически, и то будет хорошо.
Loopback wrote:
Ну ок, как появится что-то, что можно повторить - вернёмся к этому.

Я буду ещё пересматривать и оптимизировать эту кнопку, когда появится возможность. Так что да - можно будет к этому вернуться со временем.

А пока заменил получение данных от объекта Plugin на:
Code:
A_DateTime = Date('yyyyMMdd', FileGetTime(A_Wdx))

Проблема стала появляться значительно реже, но всё ещё появляется. Думал, что это как-то связано с GetState(), т.к. у меня перед выстраиванием меню каждый раз запрашивается GetState("paths"). Внёс некоторые изменения, не помогло. Скорее всего это никак не связано с какой-то отдельной функцией Autorun, объектом или вызовом, просто кода довольно много собрано в ControlSetHint и в ControlSetMouseAction. А когда эти две функции одновременно выполняются (при наведении и нажатии на кнопку B:7), происходит какой-то конфликт, который и приводит к завалу ТС.

В общем, разберемся со временем.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 797

Post (Separately) Posted: Sun Jul 27, 2025 19:20    Post subject: Reply with quote

Loopback
Решил добить я это дело, так как вылет ТС всё-таки раздражает, и, кажется, понял в чём проблема.

Код для теста и воспроизведения проблемы:

 Hidden text

В общем, ТС на самом деле не валился, а просто выходил по cm_Exit, то есть получалось, что время от времени ControlSetMouseAction не срабатывала и нажималась обычная кнопка выхода, хотя этого не должно происходить. В примере выше функция F7MouseAction тоже иногда не срабатывает, что приводит не к вызову меню, а запуску стандартного диалога для создания нового каталога. Но будьте готовы, что баг проявляется довольно редко - может потребоваться 10-15 кликов, и то нет гарантии, что поймаете ) Нужно стараться кликнуть прямо перед самым появлением подсказки. У меня он, конечно, проявлялся намного чаще, пока не заменил получение данных от Plugin("FileDateTime") на Date('yyyyMMdd', FileGetTime(A_Wdx)).
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1579

Post (Separately) Posted: Sun Jul 27, 2025 22:21    Post subject: Reply with quote

Orion9 wrote:
Но будьте готовы, что баг проявляется довольно редко

Я так и не смог добиться описанного эффекта.

Единственный момент, когда на самом деле вызывается исходное действие кнопки - это когда курсор находится над самым её краем с левой стороны, буквально в пределах нескольких пикселей. Тут дело в том, что нет возможности точно узнать ширину и координаты этих кнопок, они рассчитываются исходя из общей ширины контрола и позиции кнопки, в результате возникает ошибка координат прямоугольника, тем большая, чем правее расположена кнопка. Если не переопределять исходное действие, это обычно незаметно.

Возможно, это и есть причина, но она никак не связана с подсказками.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 797

Post (Separately) Posted: Mon Jul 28, 2025 00:14    Post subject: Reply with quote

Loopback
Вероятно, так и есть. Я почему-то был уверен, что дело именно в конфликте двух привязанных к контролу функций - ControlSetHint и ControlSetMouseAction, которые приводили к вылету из ТС. Но теперь стало понятно, что никакого вылета и не было, а просто срабатывало исходное действие кнопки "Выход". В свое время я наловчился обходить этот вылет ТС "умелым" кликом после появления подсказки - так мне казалось безопаснее, чем кликать до её появления ) Но поскольку давно не пользовался этой кнопкой и её функционалом, связанным с Autorun, завалил несколько раз ТС, что и привело к желанию написать о баге и разобраться с ним наконец, хотя это следовало сделать намного раньше.

Спасибо, что помогли разобраться! )
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1579

Post (Separately) Posted: Mon Jul 28, 2025 13:40    Post subject: Reply with quote

Orion9 wrote:
Вероятно, так и есть.

Это хорошо. Конечно, такое смещение кнопок тоже косячок, надо будет попробовать исправить.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 797

Post (Separately) Posted: Mon Jul 28, 2025 17:58    Post subject: Reply with quote

Loopback wrote:
надо будет попробовать исправить

Да, было бы здорово. Но и сейчас уже стало неплохо, когда знаешь истинную причину. Стараюсь теперь ближе к центру кликать по горизонтали - пока ни разу не лоханулся промахнулся )

Кстати, неплохой пример с менюшкой на предыдущей странице. Я когда с функцией обратного вызова разбирался, тоже пробовал что-то такое. С практической точки зрения совершенно бесполезное, но с технической точки зрения может кому-то пригодится:
Code:
# WM_MENUSELECT
SetMessageAction /P 0x011F "MenuSelectCallback"    

Func MenuSelectCallback(hWnd, uMsg, wParam, lParam)
    Local buf = Buffer(100), _         
          nId = BitAND(wParam, 0xffff)
    DllCall("GetMenuStringW", _
            "handle", lParam, _   
            "uint", nId, _   
            "ptr", buf.ptr, _   
            "int", 50, _
            "uint", 0)
    WinSetText("uMsg: " & uMsg & " ID: " & nId & " lParam: " & lParam & " Item: " & buf.GetStr())   
    ShowHint("uMsg: "   & uMsg & auCRLF & _
             "ID: "     & nId & auCRLF & _
             "lParam: " & lParam & auCRLF & _
             "Item: "   & buf.GetStr(), "", "", 500, 1)         
EndFunc

Функция MenuSelectCallback вешается на сообщение WM_MENUSELECT в окне ТС и вызывается каждый раз, когда происходит выбор пункта меню. Работает и на верхнем меню ТС, и на контекстном. Функция ничего не делает, только выводит информацию о пункте меню в заголовок и в отдельную подсказку, но неплохо демонстрирует, как работает Callback через SetMessageAction.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 193, 194, 195, 196  Next
Page 194 of 196

 
Jump to:  
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