Autorun

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

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

A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):В Autorun нет легкого способа работать с графическим интерфейсом, поэтому приходится вызывать vbs-скрипт из autorun-скрипта. Попробуйте заменить функцию SetTorrentDrives() на новый блок, должно помочь:
[cut]

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

Global gVbsInputBox

Func SetTorrentDrives()
    Local out, drives, vbs
    
    IniRead drives %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"    
    vbs = '/c ECHO Wscript.Echo Inputbox("Search on these disks:","Autorun","' & drives & '")>%TEMP%\~auto_0001.vbs'
    
    ProcessExecGetOutput out %COMSPEC% %vbs%
    
    gVbsInputBox = 1
    RunThread("WinVbsInputBoxActivate")
    ProcessExecGetOutput /OEM out "cscript.exe" "/nologo ~auto_0001.vbs" %TEMP%
    gVbsInputBox = 0
    
    out = StrTrim(out)
    If out = "" Then Return
    
    IniWrite %COMMANDER_INI% "Autorun" "TorrentDrives" %out%
    Sleep(50)
    MsgBox("Ключ сохранен.", "Autorun", 64)           
EndFunc

Func WinVbsInputBoxActivate()
    Local hVbs
    While gVbsInputBox
        hVbs = WinFind(0, "#32770", "Autorun")
        If hVbs > 0 Then
           WinSetState(23, hVbs)
           Break
        EndIf
        Sleep(50)
    Wend
EndFunc
[/cut]
Orion9
Спасибо, помогло, окно выбора дисков для поиска на передний план вышло.
Orion9 писал(а):Теперь если CapsLock включен, будет автоматический переход. Если выключен, будет прежнее окно с сообщением. Как говорится "Autorun - мечты сбываются". Осталось только кнопки под это дело обновить:
Спасибо, с автопереходом прям как в мечте, особенно через Everything.
Осталось убрать сообщение перед запуском поиска
[cut]Изображение[/cut]
чтоб совсем турборежим при включенном CapsLock повесив выполнение кнопки на клавиши Alt+T (простой) и Alt+P (Everything).


[s]Но режим автоперехода у меня работает и с выключенным и с включенным CapsLock.[/s]
При ВКЛюченном CapsLock ищет с предложением сохранить в TXT файл.
При ВЫКЛюченном CapsLock ищет с Автопереходом в конце.

Для того случая когда два объекта находит для одной и той же папки:
- Автопереход + простой поиск - показывается выделенная основная папка (не заходя в неё)

-Автопереход + Everything поиск - показывается результат внутри основной папки (зайдя в неё, перед тобой папка BDMV)
Последний раз редактировалось A55555 Сб сен 20, 2025 00:40, всего редактировалось 2 раза.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555
Точно не работает CapsLock?

Сделать "тихий" режим можно тем же образом. Поменяйте фрагмент кода с начальным сообщением на новый код с условием If Not :

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

If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then
       MsgBox("Поиск данных торрента:" & auCRLF & auCRLF & _
              "Имя: "    & name & auCRLF & _
              "Размер: " & size & auCRLF & _
              "Файлов: " & files & auCRLF & auCRLF & _ 
              "Диски поиска: " & gDriveInclude & auCRLF & auCRLF & _       
              "Продолжить?", "Autorun", 3+32+0)
       If EXTENDED <> 6 Then Return
    Endif
Работает?
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Loopback
В связи с настройкой подсветки синтаксиса, разъясните, пожалуйста, пару недоумений.

1. Чувствительны к регистру: имена констант, макросов, переменных в плагинах SysInfo и Process. Нечувствительны к регистру: команды условий/циклов/операторов, имена встроенных функций, свойства/методы объектов. Правильно?

2. Чувствительны ли к регистру конструкторы объектов (BinaryFile, List, WMIQuery и т.п.) ?

3. Чувствительны ли к регистру значения параметров <info> в FileGetVersion, <mode> в FinFile?

4. В объектах между методом и скобками допускаются пробелы? Т.е. вот так можно: «obj.Add (Item1, Item2, Item3)» ?

5. В объектах же после точки пробелы допускаются? Т.е. вот так можно: «obj. Clone()» ?

6. В функциях перед скобками допускаются пробелы. Правильно?

7. В параметрах DllCall звёздочка * как указатель на значение после каких имён может быть употреблена? «(ptr|dword)\*», а ещё какие?

Orion9
Я в подсветке ещё кое-чего доделал. А Вы в AkelPad'е AutoComplete'ом пользуетесь? (На всякий случай: это я про окошко, которое появляется пока набираешь, и можно выбрать уже готовый блок: в подсветке все эти автодополнения перечислены в секции Blocks, в самом конце файла.)
Amo ergo sum
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):A55555
Точно не работает CapsLock?
У меня клавиатура портативная и гасит лампочку, запутала.

Перепроверил.
При ВКЛюченном CapsLock ищет с предложением сохранить в TXT файл.
При ВЫКЛюченном CapsLock ищет с Автопереходом в конце.
Т.е. с точностью до наоборот.
Orion9 писал(а): Сделать "тихий" режим можно тем же образом. Поменяйте фрагмент кода с начальным сообщением на новый код с условием If Not :
[cut]

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

If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then
       MsgBox("Поиск данных торрента:" & auCRLF & auCRLF & _
              "Имя: "    & name & auCRLF & _
              "Размер: " & size & auCRLF & _
              "Файлов: " & files & auCRLF & auCRLF & _ 
              "Диски поиска: " & gDriveInclude & auCRLF & auCRLF & _       
              "Продолжить?", "Autorun", 3+32+0)
       If EXTENDED <> 6 Then Return
    Endif
[/cut]
Работает?
Пушка! Работает!
Через Everything и Alt+P (70501) вообще сказочно. Простым вполне можно чуть подождать, тоже хорошо.

Everything может можно привязать попытку запустить это приложение по указанному пути в свернутом виде при выполнении 70501, перед тем как выскакивает cообщение "окно Everything не найдено". Может и выгружать после поиска, но это уже как-то излишне.
Или привязать это приложение к старту Autorun/TC, чтоб стартовало при запуске свернуто и, если это не целая эпопея, закрывалось вместе с Autorun/TC.
Или может
Последний раз редактировалось A55555 Сб сен 20, 2025 11:55, всего редактировалось 2 раза.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

yozhik писал(а):Я в подсветке ещё кое-чего доделал
Скачал весь архив. В mnu у вас и в старых версиях ошибка:
Изображение
Я ее исправил для себя:
Изображение
Но хотелось-бы, чтобы вы у себя исправили.
dsl, fea не тестил.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yahuu

Да, есть такое. Эти функции уже начинают напоминать известный мем :?
yozhik писал(а):1. Чувствительны к регистру: имена констант, макросов, переменных в плагинах SysInfo и Process. Нечувствительны к регистру: команды условий/циклов/операторов, имена встроенных функций, свойства/методы объектов. Правильно?

2. Чувствительны ли к регистру конструкторы объектов (BinaryFile, List, WMIQuery и т.п.) ?
Нет, все имена переменных, макросов, функций (в т. ч. конструкторов), методов и свойств - не зависят от регистра. Без разницы, в основном плагине или субплагинах. Ключевые слова также не зависят.

yozhik писал(а):3. Чувствительны ли к регистру значения параметров <info> в FileGetVersion, <mode> в FinFile?
Я обычно везде делаю идентификаторы не зависящие от регистра. В тех случаях, когда регистр важен, это указывается в описании к функции. Может где и недоглядел, конечно, но в общем случае так.

Перечисленные функции не исключение.
yozhik писал(а):4. В объектах между методом и скобками допускаются пробелы? Т.е. вот так можно: «obj.Add (Item1, Item2, Item3)» ?
Допускаются.
yozhik писал(а):5. В объектах же после точки пробелы допускаются? Т.е. вот так можно: «obj. Clone()» ?
А вот здесь нет, нельзя.
yozhik писал(а):6. В функциях перед скобками допускаются пробелы. Правильно?
Да.
yozhik писал(а):7. В параметрах DllCall звёздочка * как указатель на значение после каких имён может быть употреблена? «(ptr|dword)\*», а ещё какие?
Может использоваться с любым типом, кроме str и wstr.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

yozhik писал(а):Я в подсветке ещё кое-чего доделал.
Ого! Да там прилично добавилось!
yozhik писал(а):А Вы в AkelPad'е AutoComplete'ом пользуетесь?
Пользуюсь, конечно. Очень удобно, не нужно каждый раз в справку лезть, когда забыл порядок параметров к функции или команде. Я бы и CodeFold чаще использовал, но, к сожалению, он иногда подводит. Функции в функции бывает вкладываются.
[cut]

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

Func SetMediaInfo()
 
    MediaInfoNum += 1
    If MediaInfoNum > 4 Then MediaInfoNum = 1
    
    Switch MediaInfoNum
    Case 1
       MediaInfoParams = " --Language=file://ru.csv"
    Case 2
       MediaInfoParams = " --Complete=1 --Language=file://ru.csv"
    Case 3
       MediaInfoParams = " --Complete=0"
    Case 4
       MediaInfoParams = " --Output=file://hint.txt"       
    EndSwitch
    
    ShowHint("Параметры MediaInfo: " & MediaInfoParams, "", "", 1500)

EndFunc

Static MediaInfoMode = 1

Func JoinHint(FileName, FieldIndex, UnitIndex)
...
...
EndFunc
[/cut]
Вот, вроде не сильно запутанный код, а функция JoinHint вкладывается в SetMediaInfo. Что касается подсветки, сейчас она вообще шикарно выглядит. Я немного подправил значение "AREA" в цветовой схеме и отключил жирный с курсивом в настройках, но все остальное смотрится просто класс. Можно заценить на последнем модуле, я его всё-равно собирался приложить в связи с последними изменениями:
[cut="Torrent.aucfg"]

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

#Pragma IncludeOnce

# 70500-70599

RegisterCommand 70500 "TorrentFindData" 0
RegisterCommand 70501 "TorrentFindData" 1
RegisterCommand 70502 "GoToPathFromTextFile"

RegisterCommand 70505 "TorrentSize"

Global gTorrentSize = 0, gTorrentCount = 0, gDriveInclude = "e:\;f:\;g:\;h:\;i:\;j:"

Global h_WinFindTorr = 0
Global g_WinFindTorr = 0, g_FindTorrTask = 0
Global o_WinFindTorr = Callback("WinFindTorrProc", "hwnd;uint;wparam;lparam")

Func WinFindTorrProc(hWnd, uMsg, wParam, lParam)
    Static WM_CLOSE = 0x0010
    If uMsg = WM_CLOSE Then
       If DllCall("DestroyWindow", "handle", hWnd) Then
          h_WinFindTorr = 0        
          g_FindTorrTask = 0
       EndIf   
       Return 0
    EndIf
    Return DllCall("CallWindowProcW", "ptr", g_WinFindTorr, _
                                      "hwnd", hWnd, "uint", uMsg, "wparam", wParam, "lparam", lParam)
EndFunc

Func WinFindTorrentData()
    Local hIco    
    h_WinFindTorr = DllCall("CreateWindowExW", _
                            "dword", 0, _
                            "wstr", "msctls_progress32", _
                            "wstr", "", _
                            "dword", 0x00C80000, _
                            "int", 200, "int", 100, "int", Scale(400), "int", Scale(50), _
                            "handle", AUTORUN_TCHANDLE, _
                            "handle", 0, "handle", 0, "ptr", 0, "handle")
    If h_WinFindTorr = 0 Then Return 0
    
    WinAlign(h_WinFindTorr, 0, DllCall("GetDesktopWindow"))
    WinSetPos("", -Scale(50), "", "", 1, h_WinFindTorr)
    WinSetState(5, h_WinFindTorr)
    
    g_WinFindTorr = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
                            "hwnd", h_WinFindTorr, _
                            "int", -4, _
                            "long_ptr", o_WinFindTorr.Ptr, "ptr")
                            
    Static PBS_MARQUEE     =  0x08, _
           PBM_SETMARQUEE  =  1034, _
           WM_GETICON      =  0x7f, _
           WM_SETICON      =  0x80
           
    hIco = SendMessage(AUTORUN_TCHANDLE, WM_GETICON, 2, 0)                     
    SendMessage(h_WinFindTorr, WM_SETICON, 0, hIco)
    
    WinSetStyle(PBS_MARQUEE, 2, h_WinFindTorr)    
    SendMessage(h_WinFindTorr, PBM_SETMARQUEE, 1, 0)
    
    WinSetText("Searching...", h_WinFindTorr)
    
    g_FindTorrTask = 1
    While g_FindTorrTask
        Sleep(50)
    Wend
    h_WinFindTorr = 0
EndFunc

Func TorrentFindData(lParam, nMode)
    If IsPressed(0x10) And Not nMode Then
       SetTorrentDrives()
       Return
    EndIf
    Local bEverything = nMode
    If h_WinFindTorr Then
       SendMessage(h_WinFindTorr, 0x0010, 0, 0)
       g_FindTorrTask = 0  
       Return
    Endif
    Static buf = Buffer(256)
    buf.Zero()
    Local nSymb = DllCall("GetLogicalDriveStringsW", "dword", buf.size, "ptr", buf.ptr)    
    If Not nSymb Then
       MsgBox("Не удалось получить список логических дисков" & auCRLF "SYSERROR: " & SYSERROR, "Autorun")
       Return
    EndIf
    Static aDrive = List(), aFound = List()
    Local i = 0, sz, sDrives
    aDrive.Count = 0
    While 1
       sDrive = buf.GetStr(i)
       sz = StrLen(sDrive)
       If sz = 0 Then break
       aDrive.add(sDrive)
       i = i + sz*2 + 2
    Wend
    sDrives = aDrive.text
    #MsgBox(sDrives)    
    Local obj = Plugin("TCTorrent")
    If ERROR <> 0 Then
       ShowHint("TCTorrent.wdx plugin error " & ERROR)
       Return
    Endif
    Local lRet = false 
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    If Not FileExist(sFile) Then 
       ShowHint("Файл не существует " & sFile)
       lRet = true
    ElseIf StrPos(FileGetAttr(sFile), "D") Then
       ShowHint("Каталог " & sFile)
       lRet = true       
    Else
       obj.FileName = sFile
       Local name =  obj.GetValue(0)
       Local size = obj.GetValue(2,0)	# size -> bytes       
       Local files = obj.GetValue(1)
       If files < 1 Then
          ShowHint("Файл не является торрент-файлом " & sFile)
          lRet = true        
       EndIf
    Endif
    Free(obj)
    If lRet Then Return
    IniRead gDriveInclude %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
    If Not BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then
       MsgBox("Поиск данных торрента:" & auCRLF & auCRLF & _
              "Имя: "    & name & auCRLF & _
              "Размер: " & size & auCRLF & _
              "Файлов: " & files & auCRLF & auCRLF & _ 
              "Диски поиска: " & gDriveInclude & auCRLF & auCRLF & _       
              "Продолжить?", "Autorun", 3+32+0)
       If EXTENDED <> 6 Then Return
    Endif
    aFound.Count = 0    
    gTorrentSize = size
    h_WinFindTorr = 0
    gTorrentCount = 0
    RunThread "WinFindTorrentData"
    While g_FindTorrTask = 0
        Sleep(50)
    Wend
    Local found
    If bEverything Then      
       found = FileFindEv("size:" & gTorrentSize, "", "")
       Local nError = ERROR
       If nError = 1 Then MsgBox("Не найдено окно Everything.")
       If nError = 2 Then MsgBox("Ошибка выполнения запроса к IPC Everything.")  
       If nError > 0 Then 
          g_FindTorrTask = 0
          Return
        EndIf  
    Else   
       For i = 0 to aDrive.Count -1
           If StrPos(gDriveInclude, aDrive[i]) Then
            If files > 1 Then
               found &= FileFind(aDrive[i], "*.*", 1, 2, "PathList", "Func:FindTorrentDir") & auCRLF
            Else
               found &= FileFind(aDrive[i], "*.*", 1, 1, "PathList", "Func:FindTorrentFile") & auCRLF
            EndIf   
           Endif   
       Next
    EndIf   
    found = StrTrim(found)
    aFound.Text = found
    If bEverything Then gTorrentCount = aFound.Count     
    If g_FindTorrTask = 0 Then
       If gTorrentCount = 0 Then
          MsgBox("Поиск отменен" & auCRLF & auCRLF & _
                 "Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 48)
       
       Else
          MsgBox("Поиск отменен" & auCRLF & auCRLF & _
                 "Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _       
                 "Сохранить в текстовый файл?", "Autorun", 3+48+0)
          If EXTENDED = 2 Then Return
          If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
          If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
       EndIf
    Else 
       g_FindTorrTask = 0
       SendMessage(h_WinFindTorr, 0x0010, 0, 0)
       If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
       If gTorrentCount = 0 Then       
          MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found, "Autorun", 64)
       Else
          If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then
             SetHintParam("ShowHint", "Font", 15, "Arial")
             SetHintParam("ShowHint", "BackColor", 0xFF0000)
             SetHintParam("ShowHint", "Text", 0xFFFFFF)     
             ShowHint("Автопереход к найденому", 0, 0, 1000, 1)
             WinAlign(LAST_HINT_WINDOW)
             Sleep(100)         
             SetHintParam("ShowHint", "Reload")             
             GoToPathFromMsg(aFound[0])
             Return
          EndIf
          MsgBox("Найдено: " & gTorrentCount & auCRLF & auCRLF & found & auCRLF & auCRLF & _       
                 "Сохранить в текстовый файл?", "Autorun", 3+64+0)
          If EXTENDED = 2 Then Return
          If EXTENDED = 7 Then GoToPathFromMsg(aFound[0])
          If EXTENDED = 6 Then SaveDataPathToText(sFile, found)
       EndIf
    EndIf
EndFunc

Func SaveDataPathToText(Filename, DataPath)
     Local file = FileChangeExt(Filename, "txt"), bGoto = false
     If FileExist(file) Then
        MsgBox("Файл существует" & auCRLF & auCRLF & _
                file & auCRLF & auCRLF & "Перезаписать?", "Autorun", 3+32+0)
        If EXTENDED <> 6 Then Return
     EndIf
     FileWrite(file, DataPath)
     #MsgBox("Файл сохранен " & auCRLF & auCRLF & file, "Autorun", 64)
     SetHintParam("ShowHint", "Font", 15, "Arial")
     SetHintParam("ShowHint", "BackColor", 0xFF0000)
     SetHintParam("ShowHint", "Text", 0xFFFFFF)     
     ShowHint("Файл сохранен", 0, 0, 1000, 1)
     WinAlign(LAST_HINT_WINDOW)
     Sleep(100)         
     SetHintParam("ShowHint", "Reload")
     If bGoto Then
        If RequestInfo(1000) = 1 Then
           CommandExec /CD %'file'
        Else
           CommandExec /CD '' %'file'
        Endif
     Endif   
EndFunc

Func GoToPathFromTextFile()
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    If Not FileExist(sFile) Then 
       ShowHint("Файл не существует " & sFile)
       Return
    ElseIf StrPos(FileGetAttr(sFile), "D") Then
       ShowHint("Файл является каталогом " & sFile)
       Return
    ElseIf FileGetExt(sFile) <> "TXT" Then
       ShowHint("Расширение файла не .txt " & sFile)
       Return
    ElseIf FileGetSize(sFile) > 1024*2 Then
       ShowHint("Размер файла больше 2 Кб " & sFile)
       Return       
    EndIf
    Local txt = FileRead(sFile)
    Local target = StrPart(txt, auCRLF, 1)
    If target <> "" Then
       GoToPathFromMsg(target)
    Else   
       ShowHint("Пустой путь" & target)  
    EndIf    
EndFunc

Func GoToPathFromMsg(Target)
    If FileExist(Target) Then
       If RequestInfo(1000) = 2 Then
          CommandExec /CD %'Target'
       Else
          CommandExec /CD '' %'Target'
       Endif
       SendCommand(4006)
       If StrPos(FileGetAttr(Target), "D") Then SendCommand(2002)
    Else
       ShowHint("Путь не существует " & Target)
    EndIf    
EndFunc

Func FindTorrentFile(file)
    Static T1 = GetUptime()
    If Not g_FindTorrTask Then Return 0
    If Round(GetUptime() - T1, 0) > 200 Then 
       WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
       T1 = GetUptime()
       Sleep(5)
    EndIf         
    If file.size = gTorrentSize Then 
       gTorrentCount += 1
       Return 1
    EndIf
    Return 2
EndFunc

Func FindTorrentDir(file)
    Static T2 = GetUptime()
    If Not g_FindTorrTask Then Return 0
    If Round(GetUptime() - T2, 0) > 200 Then 
       WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
       T2 = GetUptime()
       Sleep(5)
    EndIf   
    Local sz = FileFind(file.FullPath, "*.*", 1, 0, "TotalSize")  
    If sz = gTorrentSize Then 
       gTorrentCount += 1
       Return 1
    EndIf    
    Return 2
EndFunc

Global gVbsInputBox

Func SetTorrentDrives()
    Local out, drives, vbs
    
    IniRead drives %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"    
    vbs = '/c ECHO Wscript.Echo Inputbox("Search on these disks:","Autorun","' & drives & '")>%TEMP%\~auto_0001.vbs'
    
    ProcessExecGetOutput out %COMSPEC% %vbs%
    
    gVbsInputBox = 1
    RunThread("WinVbsInputBoxActivate")
    ProcessExecGetOutput /OEM out "cscript.exe" "/nologo ~auto_0001.vbs" %TEMP%
    gVbsInputBox = 0
    
    out = StrTrim(out)
    If out = "" Then Return
    
    IniWrite %COMMANDER_INI% "Autorun" "TorrentDrives" %out%
    Sleep(50)
    MsgBox("Ключ сохранен.", "Autorun", 64)           
EndFunc

Func WinVbsInputBoxActivate()
    Local hVbs
    While gVbsInputBox
        hVbs = WinFind(0, "#32770", "Autorun")
        If hVbs > 0 Then
           WinSetState(23, hVbs)
           Break
        EndIf
        Sleep(50)
    Wend
EndFunc

Func TorrentSize(lParam)
    Local T1 = GetUptime()
    Local obj = Plugin("TCTorrent")
    If ERROR <> 0 Then
       ShowHint("TCTorrent.wdx plugin error " & ERROR)
       Return
    Endif
    Local size = 0, files = 0
    Local aSel = List()
          aSel.Text = GetSelectedItems(3, 0)       
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    Local lRet = false
    If aSel.Count = 0 Then
       If Not FileExist(sFile) Then 
          ShowHint("Файл не существует " & sFile)
          lRet = true
       ElseIf StrPos(FileGetAttr(sFile), "D") Then
          ShowHint("Каталог " & sFile)
          lRet = true       
       Else
          obj.FileName = sFile
          files = obj.GetValue(1)
          size = obj.GetValue(2,0)	# size -> bytes
          Free(obj)
       Endif
    EndIf
    If lRet Then
       Free(obj, aSel)
       Return
    EndIf
    If aSel.Count > 10 Then
       ShowHint("Выделено: " & aSel.Count & auCRLF & "Подсчёт времени...")
    EndIf    
    Local j, k = 0, dirs = 0, torrs = 0
    If aSel.Count > 0 Then
       For j = 0 To aSel.Count - 1
          sFile = sPath & aSel[j]
          If FileExist(sFile) Then 
             k += 1
             If Not StrPos(FileGetAttr(sFile), "D") Then
               obj.FileName = sFile
               s = obj.GetValue(2,0)
               If s > 0 Then 
                  size += s
                  files += obj.GetValue(1)
                  torrs += 1 
               Endif  
             Else   
               dirs += 1
             Endif   
          EndIf
       Next
       sName = "S/A: " & aSel.Count & "/" & k	# Selected / Available
    Else
       SetHintParam("ShowHint", "Font", 10, "")
       ShowHint("" & sName & auCRLF & _
                "Размер: " & SizeFormat(size, 1, 'G', 2, 1) & auCRLF & _
                "Файлов: " & files)
       Sleep(100)
       SetHintParam("ShowHint", "Reload")
       Free(aSel)
       Return
    EndIf
    Local tl = Round(GetUptime() - T1, 0) / 1000
    SetHintParam("ShowHint", "Font", 10, "")
    ShowHint((k = aSel.Count ? "" : "Файл " & sName & auCRLF) & _
             "Элементов: " & aSel.Count & auCRLF & _
             "Обработано: " & torrs & auCRLF & _
             "Каталогов: " & dirs & auCRLF & _              
             "Размер: " & SizeFormat(size, 0, 'M', 2) & auCRLF & _
             "Размер: " & SizeFormat(size, 0, 'G', 2) & auCRLF & _
             "Размер: " & SizeFormat(size, 0, 'T', 4) & auCRLF & _
             "Файлов: " & files & auCRLF & _                       
             "Powered by TCTorrent.wdx" & auCRLF & _
             "Время операции: " &  StrFormat("%.3f", tl) & " sec")
    Sleep(100)
    SetHintParam("ShowHint", "Reload")          
    Free(obj, aSel)
EndFunc
[/cut]
Все объекты и последние функции, всё подсвечивается.
A55555 писал(а):Через Everything и Alt+P (70501) вообще сказочно.
Согласен. Просто песня. Прошелся сейчас по каталогу "uTorrent\torrents", где у меня хранятся торрент-файлы... аж кайфанул. Не успевашь нажать, как тут же путь к данным открывается на другой панели. Удобно, черт возьми! Вы определенно знали, что хотели, я лишь немного помог воплотить это в жизнь )
Кстати, ALT+P это моя ошибка. Я сначала думал, что не успею втиснуть Everything и использовал эту комбинацию для перехода по пути из текстового файла. Но в последний момент все же добавил Everything, а комбинацию обновить забыл. Как-то не очень очевидно ALT+P для Everything, но это легко поменять.
А касаемо старта, это тоже легко. Проще всего сделать команду, к примеру:

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

[em_everything]
cmd=%COMMANDER_PATH%\Soft\Everything.exe
param=-startup
И теперь эту команду можно хоть в кнопку, хоть в хоткей, хоть в автозагрузку ставить. Я обычно не держу эту утилиту у себя в фоне, поэтому вызываю ее из меню при необходимости.
A55555 писал(а):-Автопереход + Everything поиск - показывается результат внутри основной папки (зайдя в неё, перед тобой папка BDMV)
Так возвращает результат Everything, с этим ничего не пожелаешь, если только дополнительно его не обрабатывать. Но вы не заморачивайтесь этим. Как я писал, пустые каталоги нужно видеть, потому что в них может быть ошибка. Если создать 5 каталогов внутри друг друга и положить в последний несколько файлов, то все пять каталогов будут одного размера. В этой структуре нельзя заранее определить какой именно каталог можно отнести к торрент-файлу. Важно, что все каталоги находятся, и вы сами должны принять решение, какой из них нужно ставить на раздачу.
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):А касаемо старта, это тоже легко. Проще всего сделать команду, к примеру:

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

[em_everything]
cmd=%COMMANDER_PATH%\Soft\Everything.exe
param=-startup
И теперь эту команду можно хоть в кнопку, хоть в хоткей, хоть в автозагрузку ставить. Я обычно не держу эту утилиту у себя в фоне, поэтому вызываю ее из меню при необходимости.
Orion9
Спасибо. Поставил запуск этой программы в ваш код Torrent.aucfg

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

CommandExec em_everything
Теперь не нужно вручную запускать Everything.exe и свернуто сразу в трей.

Но не смог понять, есть ли такое место в коде, чтоб по-хитрому указать этот запуск.
Когда пользуюсь обычным поиском, то чтоб эта команда не выполнялась, когда через Everything_поиск выполнялась команда запуска?
Последний раз редактировалось A55555 Вс сен 21, 2025 00:08, всего редактировалось 1 раз.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

AkulaBig
Ух, да, точно — это я в mnu забыл про свои пользовательские переменные. Заменил их на стандартные. Спасибо.

Loopback
Спасибо!!
Loopback писал(а):В тех случаях, когда регистр важен, это указывается в описании к функции. Может где и недоглядел
Нет, всё там у Вас на месте, недоглядов нету. Это я для пущей уверенности спросил.

---

В общем, в подсветке по последним замечаниям всё поправил, кое-чего добавил, пару косяков выправил. Обновляйтесь, пожалуйста. Дальше будем поглядывать, может ещё что проявится.

Добавлено спустя 48 минут:

Orion9
CodeFold вроде починил (только что, чуть не забыл про него). Пример Ваш (спасибо за него) теперь корректно обрабатывается, но буду ещё присматриваться.
Amo ergo sum
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Loopback
подскажите пожалуйста, что не так с этой записью, Everything не закрывается

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

# After this line all actions are performed when TC closing
# После этой строки все действия выполняются при закрытии TC
Pragma AutorunFinalizeSection
If ProcessExist /F '%commander_path%\Everything.exe' Then
ProcessTerminate /F /TT /A /W '%commander_path%\Everything.exe'
EndIf
Так тоже не сработало :(

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

Pragma AutorunFinalizeSection
ShellExec %commander_path%\everything.exe -exit
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

A55555 писал(а):Так тоже не сработало

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

# After this line all actions are performed when TC closing
Pragma AutorunFinalizeSection
ShellExec(COMMANDER_PATH & "\Utils\Everything\Everything.exe", "-exit")
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):Но не смог понять, есть ли такое место в коде, чтоб по-хитрому указать этот запуск.
Да, есть такое место. Правда не знаю, будет ли это удобно, но можете попробовать.

Кнопки две, но функция вызывается одна, только с разными параметрами:

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

RegisterCommand 70500 "TorrentFindData" 0
RegisterCommand 70501 "TorrentFindData" 1
Параметр "1" означает, что вход со второй кнопки. Этот код передается переменной bEverything:

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

Local bEverything = nMode
Теперь если bEverything = 1 (или логическое "true"), то в функции можно предусматривать код, который будет выполняться только для ветки с Everything. Т.е. можно сделать так:

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

If bEverything Then CommandExec em_everything
Эту строку можно вставить сразу после Local bEverything = nMode или дальше по коду, например после сообщения с подтверждением о поиске. Но вероятно потребуются дополнительные проверки, запущена Everything или нет, чтобы не выполнять команду запуска каждый раз.

Кстати, для выхода можете сделать еще одну команду и вызывать ее, когда нужно:

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

[em_everything_exit]
cmd=%COMMANDER_PATH%\Soft\Everything.exe
param=-exit
yozhik писал(а):В общем, в подсветке по последним замечаниям всё поправил, кое-чего добавил, пару косяков выправил. Обновляйтесь, пожалуйста.
Вот это я понимаю Commits так Commits, не то, что у ленивого финна (думаю, вы поняли о чем речь).

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

Это, конечно, не имеет отношения к топику, но можно ли в хайлайтере к бар-файлам сделать, чтобы индексы иконок отдельно подсвечивались, а команды выделялись другим цветом, т.е. отличным от имени ключа? Иначе такая запись сливается в одну строку:

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

cmd8=em_everything
Индекс 220:

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

button8=%COMMANDER_PATH%\Wcmicons.dll,220
Loopback
Чтобы не затерялось. У вас нет планов добавить к плагину TCTorrent возможность возврата списка содержимого торрент-файлов через wdx-поле? Можно через указатель на буфер сделать, или еще что-то придумаете. Хотелось бы через Autorun вытягивать такой списочек. И кстати, не срочно. В ближайший месяц-два все-равно больше не смогу такими ударными темпами развивать функционал, хотя идея находить недокаченные раздачи довольно заманчива.
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

AkulaBig писал(а):
A55555 писал(а):Так тоже не сработало

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

# After this line all actions are performed when TC closing
Pragma AutorunFinalizeSection
ShellExec(COMMANDER_PATH & "\Utils\Everything\Everything.exe", "-exit")
AkulaBig
Спасибо.
Но тоже не получается выгрузить. Путь на свой я менял.
И командой
Orion9 писал(а):Кстати, для выхода можете сделать еще одну команду и вызывать ее, когда нужно:

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

[em_everything_exit]
cmd=%COMMANDER_PATH%\Soft\Everything.exe
param=-exit
тоже не хочет выгружаться.
Но через горячие клавиши для em_everything_exit, например Ctrl+Alt+Q срабатывает.
Ставлю после

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

# After this line all actions are performed when TC closing
Pragma AutorunFinalizeSection
CommandExec em_everything_exit
не закрывает.
Orion9 писал(а):Да, есть такое место. Правда не знаю, будет ли это удобно, но можете попробовать.

Кнопки две, но функция вызывается одна, только с разными параметрами:

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

RegisterCommand 70500 "TorrentFindData" 0
RegisterCommand 70501 "TorrentFindData" 1
Параметр "1" означает, что вход со второй кнопки. Этот код передается переменной bEverything:

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

Local bEverything = nMode
Теперь если bEverything = 1 (или логическое "true"), то в функции можно предусматривать код, который будет выполняться только для ветки с Everything. Т.е. можно сделать так:

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

If bEverything Then CommandExec em_everything
Эту строку можно вставить сразу после Local bEverything = nMode или дальше по коду, например после сообщения с подтверждением о поиске. Но вероятно потребуются дополнительные проверки, запущена Everything или нет, чтобы не выполнять команду запуска каждый раз.
Orion9
Спасибо, работает.
В настройках самой Everything галочка на опции "разрешить несколько копий программы" снята и вроде всё нормально.
Команду для выгрузки Everything

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

CommandExec em_everything_exit
поставил в Torrent.aucfg в конец кода функции

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

Func TorrentFindData(lParam, nMode)
но как и другие способы выгрузки Everything не срабатывает, но и не мешает ничего не ломает.
Пробовал и в сам Autorun.cfg

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

# После этой строки все действия выполняются при закрытии TC
Pragma AutorunFinalizeSection
CommandExec em_everything_exit
не получается.
Orion9 писал(а):В ближайший месяц-два все-равно больше не смогу такими ударными темпами развивать функционал, хотя идея находить недокаченные раздачи довольно заманчива.
Спасибо. Уже очень хорошо, но буду надеяться на продолжение по недокачанным.
Последний раз редактировалось A55555 Вс сен 21, 2025 23:48, всего редактировалось 2 раза.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

A55555 писал(а):Так тоже не сработало
В общем-то это и есть правильный вариант. У меня так срабатывает. Так что вряд ли тут Autorun при делах.

Могу только добавить, что если процесс everything запущен от имени администратора, а тотал от пользователя, то ProcessTerminate, естественно, не сработает. Но вариант с -exit в этом случае должен открыть диалог повышения привилегий, и если согласиться, то everything успешно закрывается.
Orion9 писал(а):У вас нет планов добавить к плагину TCTorrent возможность возврата списка содержимого торрент-файлов через wdx-поле?
Интересно, с чего бы им вдруг быть? :)

Но это скорее всего не получится даже чисто технически. Чтобы уместить большой список нужно передавать плагину большой буфер, чтобы в него этот список мог уместиться. А тотал (и соответственно Autorun) предоставляет буфер размером 4096 байт, т. е. всего 2 Кб для юникодной строки.

И даже если бы это было возможно, непросто найти объяснение целесообразности вывода в одно поле списка файлов (потенциально огромного) для обычного пользователя. А TCTorrent, как и TCMediaInfo, предполагался простым и понятным обычному пользователю.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):Но через горячие клавиши для em_everything_exit, например Alt+Ctrl+Q срабатывает.
Да, похоже только в секции финализации не срабатывает. У меня не было времени проверить в кнопке, но если вставить в командную строку TC и выполнить em_everything_exit, то Everything выгружается хоть от Администратора была запущена, хоть от простого пользователя.
A55555 писал(а):поставил в Torrent.aucfg в конец кода функции
Тогда тоже используйте условие If bEverything, но лучше в секцию финализации такое вставлять. Может Loopback найдет в чем причина несрабатывания.
Loopback писал(а):Интересно, с чего бы им вдруг быть?
Просто на предыдущей странице я писал:
[cut]Сейчас код опирается на плагин TCTorrent (превосходный плагин от Loopback), но wdx-часть плагина не выдает список содержимого торрента, только wlx-часть. Может, автор сделает какой-нибудь недокументированный вызов к библиотеке для получения такого списка? Тогда можно будет подумать[/cut]
Loopback писал(а):И даже если бы это было возможно, непросто найти объяснение целесообразности вывода в одно поле списка файлов (потенциально огромного) для обычного пользователя.
Об этом речи не было. Изначально речь шла о недокументированном вызове функции напрямую из библиотеки, либо, если делать wdx-поле, то передавать в это поле адрес буфера со списком и размер этого буфера (размер можно и во второе поле, например). В Autorun принимать этот буфер через BaseAddress:

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

obj = Buffer(<InitialSize>[, <BaseAddress>])
Ответить