Autorun

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

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

Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9
Да уж, сам иногда удивлюсь, во что превратился изначально ни на что особенное не претендующий плагин :) Релизы, конечно, будут, накопилось прилично изменений. Надо только собраться, найти время и привести всё к нормальному виду.
Orion9 писал(а): MsgBox с вариантами ответов
Формально это несложно, но тут есть пара проблем.

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

Вариант с сохранением совместимости - задействовать для возврата нажатой кнопки переменную ERROR, что тоже не очень хорошо, т.к. переменная предназначена для индикации ошибок, а не возврата результата.

Но тут важнее вторая проблема - у MsgBox до сих пор остаются нерешенные сложности с работой на x64 версии. Пока MsgBox используется в основном для отладки, это еще терпимо, но для реализации диалоговых механизмов такой надёжности недостаточно.
Orion9 писал(а):функции вызова всплывающей подсказки, типа ToolTip
Не совсем понятно, что, где и как должно вызываться?

Просто запрос на создание настраиваемых тултипов для функциональных кнопок уже был, но там не так всё просто.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Да уж, сам иногда удивлюсь, во что превратился изначально ни на что особенное не претендующий плагин :)
Превратился он в монстра :) Если хотите, гляньте в теме про заголовок TC, чем я занимался в последнее время.
Первая - вопрос совместимости
Ох уж эта совместимость. Не так давно начал интересоваться AutoHotkey второй версии и увидел, что есть F4MiniMenu. Поначалу обрадовался, что будет возможность изучить код и подправить его под себя, но когда увидел, что это только для первой версии AutoHotkey, желание как-то поубавилось - не хочется вникать в еще один синтаксис, притом устарелый. А одно из основных отличий AutoHotkey v1 от AutoHotkey v2 - как раз в командой и функциональной записи (во второй версии совсем отказались от командой записи, полностью заменив ее функциональной). Возможно, и вам придется делать такой переход рано или поздно, если проблемы с совместимостью будут расти как снежный ком и придется искать радикальный выход. Не думаю, что все пользователи разбегутся: кому надо, тот перейдет, а кому не надо - останется на старой версии.
Но тут важнее вторая проблема - у MsgBox до сих пор остаются нерешенные сложности с работой на x64 версии.
Пока не сталкивался с такой проблемой, хотя и видел упоминание о ней в справке. Но раз вы говорите, значит основание для того есть. Выходит, придется как-то обходиться без этой функции, если только вы чего-то не придумаете :)
Не совсем понятно, что, где и как должно вызываться?
Речь о:
https://www.autohotkey.com/docs/v2/lib/ToolTip.htm
Можно найти интересные применения, например, альтернативные подсказки к файлам или дополнительная информация, всплывающая по требованию на разных элементах окна или у курсора мыши.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):чем я занимался в последнее время
Успел, глянул. Впечатляет! К слову, в еще не выложенной версии SysInfo добавлены кое-какие нативные функции для получения системной информации, в том числе загрузки процессора, можно будет уменьшить число запросов.
Orion9 писал(а):А одно из основных отличий AutoHotkey v1 от AutoHotkey v2 - как раз в командой и функциональной записи
Да, будучи большим поклонником Autoit (пользовался им еще со второй версии), я всегда недолюбливал AHK за такую смесь синтаксисов и недоумевал - зачем? На деле всё просто: когда делался Autoit3, разработчики полностью отказались от совместимости со второй версией, поэтому синтаксис языка получился удобный и лаконичный, без командных атавизмов (cинтаксис Autorun немало почерпнул из Autoit). А в AHK пошли по пути поддержания совместимости и тянули её еще очень много лет. Хотя действительно, последние альфы/беты эту совместимость всё больше теряют (но в то же время потенциально становятся лично мне более интересны, учитывая стагнацию Autoit).

В итоге c Autorun я сам фактически прошел путь AHK :D
Orion9 писал(а):Возможно, и вам придется делать такой переход рано или поздно
Учитывая специфику использования Autorun, сомневаюсь, что потребуются кардинальные изменения синтаксиса. Все необходимые управляющие структуры уже есть. Не хватает только какого-нибудь простейшего массива. Дальнейшее развитие скорее будет направлено на расширение функционального обвеса.
Orion9 писал(а):Можно найти интересные применения
Ясно. Хотя тут сложность даже не в самом тултипе, а в том, как его вызывать. Горячие клавиши это понятно. Но если по наведению это уже совсем другое.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Успел, глянул.
Рад, что вам удалось глянуть. Это лучшая для меня награда, как и возможность отдать дань плагину живым примером его использования. Да и вам, думаю, было интересно узнать, какое применение находят другие пользователи вашему детищу :)

Я внесу туда изменения потом, чтобы оригинальный заголовок оставался нетронутым, просто пока не нашел на это время, хотя работы там и не так много. Надеюсь, это не вызовет больше претензий и все желающие смогут воспользоваться кодом по своему усмотрению (хотя бы как примером реального скрипта, полностью написанным на языке Autorun).
К слову, в еще не выложенной версии SysInfo добавлены кое-какие нативные функции для получения системной информации, в том числе загрузки процессора, можно будет уменьшить число запросов
Будет здорово. Само наличие vbs-скрипта там обусловлено тем, что для расчета формулы нужно тянуть два поля за запрос, но Autorun сейчас это не позволяет.
Да, будучи большим поклонником Autoit
Как раз хотел посмотреть вашу утилиту uwdx, но еще не успел толком, хотя уже начал. Интересен вывод в консоль и как можно извлечь из него выгоду в Autorun + ToolTip. Например:

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

ControlSetMouseAction /L /K:C 3 ShowItemHint

Func ShowItemHint
Local icacl, dat, p, buf
   dat = StrPart(ItemAtCursor('text'), auTAB, 1)
   p = SendMessage(RequestInfo(RequestInfo(1000) + 8), 13, 100, buf, 2)
   p = StrLeft(p, StrPos(p, "\", -1))
   ProcessExecGetOutput /OEM icacl %COMSPEC% "/c icacls ""%dat%""" %p%
   MsgBox(icacl)
EndFunc
Вывод сообщения по Ctrl+ПКМ о правах доступа, но можно и о чем-то другом, и не в модальном окне MsgBox, а в удобном тултипе. Кстати, я все правильно сделал в этом примере выше, или есть другие способы? А еще почему-то есть глюк с длинными именами файлов. Такое ощущение, что где-то происходит потеря символов и возникает такое сообщение:

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

PotPlayer_1.7.22077_Stable_x8: Не удается найти указанный файл.
Успешно обработано 0 файлов; не удалось обработать 1 файлов

Имя файла при этом PotPlayer_1.7.22077_Stable_x86_Portable_Rus.7z
Вы не могли бы глянуть в чем тут может быть проблема?
сомневаюсь, что потребуются кардинальные изменения синтаксиса. Все необходимые управляющие структуры уже есть. Не хватает только какого-нибудь простейшего массива. Дальнейшее развитие скорее будет направлено на расширение функционального обвеса.
Это хорошо. А то пришлось бы много работы провести без очевидного выигрыша. Меня синтаксис устраивает, главное - чтобы все работало, а функции и команды необязательно трогать (адаптировать) - можно и новые добавлять, например YesNoBox или что-то вроде того.
тут сложность даже не в самом тултипе, а в том, как его вызывать
Ну, видимо только комбинацией или другим схожим триггером. А разве нужно что-то по наведению? Так сразу в голову и не приходит. Хотя в моем примере с заголовком могло бы пригодиться теоретически, но можно и без этого прожить :)
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Кстати, я все правильно сделал в этом примере выше, или есть другие способы?
Кстати, вот и хороший реальный пример ProcessExecGetOutput нарисовался :)

По способам. Полагаю, можно еще индексом 21 получить (панель перед командной строкой), но кажется кто-то упоминал об ограничениях такого варианта, сейчас не вспомню каких.

Или с помощью WM_COPYDATA, с типом команды GW и параметрами SP. Только такой возможности в Autorun нет.

Может и еще что-то есть, сходу не вспомню.

По правильности вроде всё нормально. Только переменная buf не нужна, ее значение в данном случае всё равно игнорируется. Можно передать просто 0 или пустую строку. Надо это уточнить в справке.
Orion9 писал(а):А еще почему-то есть глюк с длинными именами файлов.
Действительно как-то странно, надо будет посмотреть, что там в ProcessExecGetOutput приходит.
Orion9 писал(а):А разве нужно что-то по наведению?
Это из предыдущего запроса. Кстати, мало тултип показать, надо еще и как-то скрыть, вот тут вижу сложности. В общем, это надо пробовать.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Спасибо за комментарий по поводу правильности/неправильности способа. Я еще только изучаю принципы автоматизации и что с ними связано, поэтому мне очень важно услышать мнения экспертов и опытных в этом деле людей для подтверждения собственных мыслей.

Исправил на p = SendMessage(RequestInfo(RequestInfo(1000) + 8), 13, 100, "" , 2) - все работает. Но вызывает вопрос параметр 100. По идее здесь должно быть точное количество байт, полученное через WM_GETTEXTLENGTH? Иначе ведь при длинном пути он просто обрежется. Или можно просто цифру побольше взять?

Попробовал довести задачу до цели через скрипт AutoHotkey, чтобы посмотреть, как оно будет выглядеть в действительности. Вроде, ничего - мне нравится!
autorun.cfg

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

Func ShowItemHint
Local icacl, dat, p
dat = StrPart(ItemAtCursor('text'), auTAB, 1)
p = SendMessage(RequestInfo(RequestInfo(1000) + 8), 13, 100, "" , 2)
p = StrLeft(p, StrPos(p, "\", -1))
dat = p & dat
ShellExec "%COMMANDER_PATH%\Scripts\ahk\AutoHotkey32.exe" "FileSec.ahk ""%dat%""" "%COMMANDER_PATH%\Scripts\ahk\"
EndFunc
FileSec.ahk

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

#SingleInstance Force

ToolTip StrBuf(RunWaitOne('icacls "' A_Args[1]))      
KeyWait "LButton", "D"
   
RunWaitOne(command) {
local sOut
dhw := A_DetectHiddenWindows
pid :=0    
    DetectHiddenWindows true
    Run A_ComSpec " /k",, "Hide", &pid
    WinWait "ahk_pid " pid
    
    DllCall("AttachConsole", "UInt", pid)
    DetectHiddenWindows dhw

    shell := ComObject("WScript.Shell")
    exec := shell.Exec(A_ComSpec . " /C " . command)    
    sOut := exec.StdOut.ReadAll()
    
    DllCall("FreeConsole")
    if ProcessExist(pid)
       ProcessClose pid
return sOut
}

StrBuf(str)
{
    buf := Buffer(StrPut(str, "CP0"))
    StrPut(str, buf, "CP0")
    return StrGet(buf.ptr, "CP866")
}
Думаю, тултип Autorun нужен. Может, вам удастся как-то решить проблему с его скрытием? Ну, а если нет - ничего страшного :)
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

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

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

MIME-Version: 1.0
Content-Type: application/octet-stream; name="Title.7z"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Title.7z"

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


Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Но вызывает вопрос параметр 100. По идее здесь должно быть точное количество байт, полученное через WM_GETTEXTLENGTH?
Только не байт, а число символов. Да, по идее лучший вариант использовать полученные значения.

Но сейчас размер буфера выделяется фиксированный, 65535 юникодных символов. Можно передать любой размер в этих пределах, им будет руководствоваться вызываемая функция.

Можно сделать, чтобы выделялся буфер с размером, передаваемым параметром, но не уверен, что такой вариант будет правильным: точно ли везде размер буфера передается вторым параметром? Тут еще можно подумать, Runtime пока сыроват.
Orion9 писал(а):Попробовал довести задачу до цели через скрипт AutoHotkey, чтобы посмотреть, как оно будет выглядеть в действительности.
Давненько я на сайт AHK не заглядывал, оказывается двойка уже зарелизилась... Да, смотрится симпатично, только задержка стала более ощутима. И еще тултип перекрывается тоталовским тултипом.

Если что, вот тут версия плагина с исправлением ProcessExecGetOutput.
Orion9 писал(а):Думаю, тултип Autorun нужен.
Немного посмотрел тултипы, да, показать несложно, сложнее скрыть. Из простых способов - по таймеру или или по клику на тултипе. А вот чтобы сделать как в вашем примере левым кликом по окну тотала - сложнее, нужно регистрировать через ControlSetMouseAction функцию на левый клик по окну тотала, и в этой функции закрывать тултип. Чем плох такой способ - эта функция будет постоянно вызываться при каждом левом клике.

В общем, тут ещё надо думать.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Тут еще можно подумать, Runtime пока сыроват.
Может, сделать пару вспомогательных функций, которые сразу будут возвращать имя файла и путь в нужной панели, и тем самым освободят пользователя от необходимости самостоятельно посылать сообщения через SendMessage и RequestInfo? Думаю, было бы удобно.
Да, смотрится симпатично, только задержка стала более ощутима. И еще тултип перекрывается тоталовским тултипом.
Да, задержка ощутима. А по поводу перекрытия я как раз хотел у вас спросить: Если тултип будет вызываться через Autorun, это не поможет ему показываться поверх тоталовского? На крайний случай, можно будет двинуть его координаты выше, чтобы они не мешали друг другу.
Если что, вот тут версия плагина с исправлением ProcessExecGetOutput
Забрал. Все работает просто мухой, и больше ничего не обрезается. Спасибо.
Немного посмотрел тултипы, да, показать несложно, сложнее скрыть.
Вариант с кликом на тултипе меня вполне устраивает. Таймер - тоже, в сочетании с кликом. По сути, применение у тултипа такое же, что и у MsgBox, только оформление другое. Хорошо будет иметь такой выбор :)
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Может, сделать пару вспомогательных функций, которые сразу будут возвращать имя файла и путь в нужной панели
Да, такие мысли проскакивали, хотя я стараюсь по возможности не увеличивать число специализированных функций. Жаль, что Гислер не пришёл к какому-нибудь единому API для двунаправленного взаимодействия с программой. Сейчас получается три метода (WM_USER+51, WM_USER+50 и WM_COPYDATA), которые в ряде моментов пересекаются. Думаю, как минимум надо добавить запросы через WM_COPYDATA, что позволит удобнее получать пути.
Orion9 писал(а):Если тултип будет вызываться через Autorun, это не поможет ему показываться поверх тоталовского?
Точно так же прячется за тоталовским. Но глубоко не смотрел.
Orion9 писал(а):По сути, применение у тултипа такое же, что и у MsgBox, только оформление другое.
Еще такой момент, для чего вообще придуманы тултипы. Они предназначены для подсказок к контролам в приложении, а не в качестве самостоятельного уведомления. При этом в приложениях тултип полностью контролируется самим приложением. Сделать это со стороны сложнее. Тут, возможно, будет более оправданным использование традиционных диалогов, по аналогии с функциями Splash* в Autoit.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Ну, как я писал чуть выше, если будут сложности, то и не заморачивайтесь сильно.

Просто, как вы понимаете, получать небольшые инфошки в MsgBox не всегда удобно. Гораздо интереснее делать это во всплывающем окне возле курсора в соответствующем оформлении, например, если нужно быстро посмотреть жесткие ссылки файла:

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

ControlSetMouseAction /L /K:C 3 ShowInfoHL

Func ShowInfoHL
Local f, p, hl, links, linkout
Local uwdx = %COMMANDER_PATH% & "\Plugins\uwdx\uwdx.exe"
   f = StrPart(ItemAtCursor('text'), auTAB, 1)
   p = SendMessage(RequestInfo(ItemAtCursor('panel') + 8), 13, 500, "" , 2)
   p = StrLeft(p, StrPos(p, "\", -1))
   f = p & f   
   ProcessExecGetOutput hl %uwdx% "NTLinks.wdx ""%f%"" 0" "%COMMANDER_PATH%\Plugins\wdx\NTLinks\"
   if hl = 0 then Return 
   ProcessExecGetOutput links %uwdx% "/C:1251 NTLinks.wdx ""%f%"" 7 0" "%COMMANDER_PATH%\Plugins\wdx\NTLinks\"
   for i=1 to hl
      linkout = linkout & StrTrim(StrPart(links, ',', i)) & auCRLF
      i = i + 1
   next
   MsgBox(linkout)
EndFunc

А что там будет вместо MsgBox - тултип или Splash скрин - роли, как таковой, не играет. Тут как раз тот случай, когда важна форма, а не содержание :) Так что делайте как вам будет удобно.
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Orion9
Попробовал приведенный пример

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

ControlSetMouseAction /L /K:C 3 ShowInfoHL
И словил ошибку

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

---------------------------
Autorun plugin error
---------------------------
Error in file: D:\TOTALCMD\plugins\WDX\Autorun\Autorun.aucfg

[58] ProcessExecGetOutput hl %uwdx% "NTLinks.wdx ""%f%"" 0" "%COMMANDER_PATH%\Plugins\wdx\NTLinks\"

Error executing process.
---------------------------
ОК   
---------------------------
TC 11.58 combo, Windows 11 x64
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

jentoso
Трудно сказать... У меня все работает. Может, с путями к uwdx что-то не так?

Кстати, хотел спросить.

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

ProcessExecGetOutput hl %uwdx% "NTLinks.wdx ""%f%"" 0" "%COMMANDER_PATH%\Plugins\wdx\NTLinks\"
   if hl = 0 then Return
Вот тут uwdx выдает "Test file does not exists.", если под курсором не файл/каталог. Думал, проверка "if hl = 0" сработает, но, по факту, получается нет. Как лучше тогда сделать, чтобы строка не приводимая к числу была принята за 0 -- выражением?
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Orion9 писал(а): Может, с путями к uwdx что-то не так?
Пути к uwdx такие же, а сам uwdx обновленный.
TC 11.58 combo, Windows 11 x64
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

jentoso
А с учетом нового ключика у вас будет работать?

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

ControlSetMouseAction /L /K:C 3 ShowFileInfo

Func ShowFileInfo
Local f, p, hl, links, linkout
Local uwdx = %COMMANDER_PATH% & "\Plugins\uwdx\uwdx.exe"
   f = StrPart(ItemAtCursor('text'), auTAB, 1)
   p = SendMessage(RequestInfo(ItemAtCursor('panel') + 8), 13, 500, "" , 2)
   p = StrLeft(p, StrPos(p, "\", -1))
   f = p & f   
   ProcessExecGetOutput hl %uwdx% "/I NTLinks.wdx ""%f%"" HLNK_Count"
   if (hl+0) = 0 then 
       MsgBox(hl)
      Return 
   endif   
   ProcessExecGetOutput links %uwdx% "/I /C:1251 NTLinks.wdx ""%f%"" HLNK_Paths 0"
   linkout = "Hard Links: "  & hl & auCRLF
   linkout = linkout & auCRLF
   for i=1 to hl
      linkout = linkout & StrTrim(StrPart(links, ',', i)) & auCRLF
      i = i + 1
   next
   MsgBox(linkout)
EndFunc
Ответить