Autorun

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

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

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

Сообщение Orion9 »

Loopback
Помнится, делал корректировку на масштабирование экрана в подсказке к главной панели инструментов несколько страниц назад, тогда использовал такой метод:

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

    # дескриптор монитора окна ТС
    Local hMon = DllCall("MonitorFromWindow", "hwnd", AUTORUN_TCHANDLE, "dword", 2)
    # информация о масштабировании экрана
    Local nScale = 0, bRes
    bRes = DllCall("Shcore.dll\GetScaleFactorForMonitor", "hwnd", hMon, "dword*", @nScale)
Но предложенные вами функции выглядят более основательно, поэтому буду использовать их. Слышал, что для полноты картины нужно ещё учитывать размер текста, который пользователь тоже может увеличить в настройках системы в разделе специальных возможностей. Один из способов - чтение значения из реестра:

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

RegRead nTextScale "HKCU\Software\Microsoft\Accessibility" "TextScaleFactor" 100
    nTextScale = Round(nTextScale/100,2)
Далее умножить полученный коэффициент на необходимое значение, т.е.

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

h_WinShutdown = DllCall("CreateWindowExW", _
                            "dword", 0, _
                            "wstr", "msctls_progress32", _
                            "wstr", "", _
                            "dword", 0x10C80000, _
                            "int", 200, "int", 100, "int", Round(Scale(300)*nTextScale,0), "int", Scale(50), _
                            "handle", AUTORUN_TCHANDLE, _
                            "handle", 0, "handle", 0, "ptr", 0, _
                            "handle")
В общем, вот полный обновленный код всего, что ранее было, включая две разные функции для получения значения масштабирования: [cut]

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

Func GetDPI()
  Local DC = DllCall("GetDC", "int", 0)
  Local lpy = DllCall("GetDeviceCaps", "handle", DC, "int", 88) # LOGPIXELSX
  DllCall("ReleaseDC", "int", 0, "handle", DC)
  Return lpy
EndFunc

Func Scale(nValue)
  Static dpi = GetDPI()
  Return DllCall("MulDiv", "int", nValue, "int", dpi, "int", 96)
EndFunc 

RegisterCommand 808000 "WinShutdown"

Global h_WinShutdown
Global g_WinShutdown, g_Shutdown = 0
Global o_WinShutdown = Callback("WinShutdownProc", "hwnd;uint;wparam;lparam")

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

Func WinShutdown()
    Local hIco
    If h_WinShutdown > 0 Then
       If WinGetState(1, h_WinShutdown) Then
          SendMessage(h_WinShutdown, 0x0010, 0, 0)
          Return
       EndIf   
       h_WinShutdown = 0
    Endif
    # дескриптор монитора окна ТС
    Local hMon = DllCall("MonitorFromWindow", "hwnd", AUTORUN_TCHANDLE, "dword", 2)
    # информация о масштабировании экрана
    Local nMonScale = 0, nTextScale
    DllCall("Shcore.dll\GetScaleFactorForMonitor", "hwnd", hMon, "dword*", @nMonScale)
    If nMonScale < 100 Then nMonScale = 100
    # информация о размере текста
    RegRead nTextScale "HKCU\Software\Microsoft\Accessibility" "TextScaleFactor" 100
    nTextScale = Round(nTextScale/100,2)
    Local nWidth = Round(3*nMonScale*nTextScale,0)
    h_WinShutdown = DllCall("CreateWindowExW", _
                            "dword", 0, _
                            "wstr", "msctls_progress32", _
                            "wstr", "", _
                            "dword", 0x10C80000, _
                            "int", 200, "int", 100, "int", Round(Scale(300)*nTextScale,0), "int", Scale(50), _
                            "handle", AUTORUN_TCHANDLE, _
                            "handle", 0, "handle", 0, "ptr", 0, _
                            "handle")
                   
    If h_WinShutdown = 0 Then Return 0
    
    WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"))     
    g_WinShutdown = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
                            "hwnd", h_WinShutdown, _
                            "int", -4, _
                            "long_ptr", o_WinShutdown.Ptr, _
                            "ptr")  
    
    hIco = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0)                     
    SendMessage(h_WinShutdown, 0x80, 0, hIco)       
                   
    g_Shutdown = 1           
    WinSetStyle(PBS_MARQUEE, 4, h_WinShutdown) 
    SendMessage(h_WinShutdown, PBM_SETPOS, 0, 0)   
    For i = 1 to 100
        SendMessage(h_WinShutdown, PBM_SETPOS, i, 0) 
        WinSetText("Выключение через " & 100-i & " сек.", h_WinShutdown)
        Sleep(900)
        If g_Shutdown = 0 Then Break
    Next 
       
    If g_Shutdown = 0 Then 
       MsgBox("Выключение ПК отменено", "", 48)
    Else       
       If DllCall("DestroyWindow", "handle", h_WinShutdown) Then h_WinShutdown = 0
       MsgBox("Выключение ПК", "", 64)
       #ShellExec("shutdown", "/s /t 60") # можно добавить /f для принудительного закрытия приложений
    EndIf   
EndFunc

# Ctrl+Alt+O
SetHotkeyAction /K:C /K:A /H:O /DM "RunThread" "CopyMonitor"

Global g_CopyMonitor = false

Func CopyMonitor()
    Static hCopyWnd = 0
    # Если монитор уже запущен - остановить
    If g_CopyMonitor Then 
       g_CopyMonitor = false
       Return
    EndIf   
    hCopyWnd = WinFind(0, "TDLG2FILEACTIONMIN")
    If hCopyWnd = 0 Then
        ShowHint("Копирование не запущено", 0, 0, 1000, 1)
        WinAlign(LAST_HINT_WINDOW)
        Return
    EndIf
    g_CopyMonitor = true
    # установка значения прозрачности    
    WinSetStyle(0x80000, 3)
    DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _ 
                                          "ptr", 0, "byte", 192, "dword", 2)
    #параметры подсказки                                      
    SetHintParam("ShowHint", "Font", 15, "Arial")
    SetHintParam("ShowHint", "BackColor", 0xFF0000)
    SetHintParam("ShowHint", "Text", 0xFFFFFF)
    ShowHint("Монитор выключения запущен, ожидание завершения копирования", 0, 0, 1000, 1)
    SetHintParam("ShowHint", "Reload")    
    WinAlign(LAST_HINT_WINDOW)
    While hCopyWnd <> 0
        For i = 1 To 10
            If Not g_CopyMonitor Then Break
            Sleep(100)
        Next
        If Not g_CopyMonitor Then Break
        hCopyWnd = WinFind(0, "TDLG2FILEACTIONMIN")
    Wend
    If g_CopyMonitor Then
       g_CopyMonitor = false
       WinShutdown()
    Else
       SetHintParam("ShowHint", "Font", 15, "Arial")
       SetHintParam("ShowHint", "BackColor", 0xFF0000)
       SetHintParam("ShowHint", "Text", 0xFFFFFF)    
       ShowHint("Монитор выключения остановлен", 0, 0, 1000, 1)
       SetHintParam("ShowHint", "Reload") 
       WinAlign(LAST_HINT_WINDOW)
    EndIf
    WinSetStyle(0x80000, 9)
    DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _ 
                                          "ptr", 0, "byte", 255, "dword", 2)
EndFunc 
[/cut]
Loopback писал(а):В каком смысле затенить?
Как было в ХР при выключении системы: фон затенялся и становился нецветным, а окно с выбором действия оставалось в цвете поверх него. Но думаю, сейчас это не надо - прозрачность даже лучше. Словно призрак остается от комманндера, стоящий лишь в один шаг от полного исчезновения вместе с системой ))
A55555 писал(а):Но этому окну отсчета напрашивается отображение поверх всех окон.
Наверное, можно. Надо глянуть. Может, автор плагина ответ уже знает?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):тогда использовал такой метод
Понятно, что некоторые вещи можно сделать разными способами. Эта функция дает масштаб в процентах. Наверно и из нее можно пересчитать, но я ей не пользовался. Тут еще минус, что она появилась только в Win 8.1.
Orion9 писал(а):для полноты картины нужно ещё учитывать размер текста
Отмасштабированное окно обычно содержит достаточно места для текста, если он масштабируется системой. Но если пользователь ещё значительно увеличит шрифт, то да, может и не уместиться. Но это все же редкое явление, нечасто встретишь программу, которая бы корректно реагировала на такое изменение. Я бы с этим заморачивался, только если программа сама позволяет менять размер шрифта в широких пределах.
Orion9 писал(а):Как было в ХР при выключении системы
Понял. Я не помню, чтобы встречал стандартную функцию для этого. Эффект скорее всего можно повторить с помощью GDI+ (сделать скриншот и обесцветить изображение), но сомневаюсь, что оно того стоит.
Orion9 писал(а):Может, автор плагина ответ уже знает?
WinSetState(30, h_WinShutdown)

[cut]Надо же, уже 200 страниц наговорили :D
[/cut]
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555 писал(а):аж захотелось на постоянно добавить окну TC прозрачности немного.
Как-то вчера прошел мимо этого комментария, а ведь Autorun очень легко может это сделать, даже пугающе легко. Я бы сказал, он создан для таких задач:

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

# Ctrl+Alt+"+"
# увеличение прозрачности окна ТС
SetHotkeyAction /K:C /K:A /V:187 /R /DM SetTransparency 1
# Ctrl+Alt+"-"
# уменьшение прозрачности окна ТС
SetHotkeyAction /K:C /K:A /V:189 /R /DM SetTransparency 2

SetTransparency(0)

Func SetTransparency(nAction)
    Local transp, flags
    If nAction = 0 Then        
       IniRead transp %COMMANDER_INI% "Autorun" "Transparency" 255
       If transp >= 100 And transp < 255 Then
          WinSetStyle(0x80000, 3)
          DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _ 
                                         "ptr", 0, "byte", transp, "dword", 2)
          Return
       EndIf
    EndIf   
    If Not WinHasStyle(0x80000, 1) Then WinSetStyle(0x80000, 3)
    If Not DllCall("GetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _ 
                                          "ptr", 0, "byte*", @transp, "dword*", @flags) Then
       ShowHint("Error getting transparancy value")
       WinSetStyle(0x80000, 5)
       Return
    EndIf
    If transp = 0 Then transp = 255
    If nAction = 1 Then transp += 1
    If nAction = 2 Then transp -= 1
    If transp < 100 Then transp = 100 
    If transp > 255 Then transp = 255    
    ShowHint("Transparency: " & transp, "", "", 1000)           
    DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _ 
                                          "ptr", 0, "byte", transp, "dword", 2)
    If transp = 255 Then WinSetStyle(0x80000, 5)
    IniWrite %COMMANDER_INI% "Autorun" "Transparency" %transp%    
EndFunc                                          
Хотел ограничиться несколькими строками для демонстрации, но потом понял, что без сохранения в ini это будет "не торт", поэтому пришлось доделать.

A55555, если вы поставили Autorun, посмотрите еще пример сворачивания в трей в справке, напоминает чем-то изменение прозрачности.
Loopback писал(а):Тут еще минус, что она появилась только в Win 8.1
Да, я видел это ограничение. Но с другой стороны, возможность масштабировать экран из настроек Windows появилась не только с Win8?
Loopback писал(а):Но если пользователь ещё значительно увеличит шрифт, то да, может и не уместиться.
Как я понял, это довольно редкий случай, поэтому и находится он в разделе "Специальные возможности". Но по идее его тоже нужно учитывать и держать в голове. Не уверен, правда, что для функционала Autorun это является актуальным.
Loopback писал(а):WinSetState(30, h_WinShutdown)
Работает, но отчасти. Наверное, для полноты картины нужно AUTORUN_TCHANDLE снять с владельца. Кстати, вот действительно полный код для тех, кто будет пользоваться или развивать его дальше, в предыдущий раз я как всегда забыл про "шапку":
[cut]

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

LoadLibrary Plugins\Autorun_Tweaks.dll
LoadLibrary Plugins\Autorun_Sysinfo.dll
LoadLibrary Plugins\Autorun_Runtime.dll
LoadLibrary Plugins\Autorun_Process.dll

Const PBM_SETPOS      =  1026, _
      PBM_SETRANGE    =  1025, _
      PBS_MARQUEE     =  0x08, _
      PBM_SETMARQUEE  =  1034
      
Func GetDPI()
  Local DC = DllCall("GetDC", "int", 0)
  Local lpy = DllCall("GetDeviceCaps", "handle", DC, "int", 88) # LOGPIXELSX
  DllCall("ReleaseDC", "int", 0, "handle", DC)
  Return lpy
EndFunc

Func Scale(nValue)
  Static dpi = GetDPI()
  Return DllCall("MulDiv", "int", nValue, "int", dpi, "int", 96)
EndFunc 

RegisterCommand 808000 "WinShutdown"

Global h_WinShutdown
Global g_WinShutdown, g_Shutdown = 0
Global o_WinShutdown = Callback("WinShutdownProc", "hwnd;uint;wparam;lparam")

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

Func WinShutdown()
    Local hIco
    If h_WinShutdown > 0 Then
       If WinGetState(1, h_WinShutdown) Then
          SendMessage(h_WinShutdown, 0x0010, 0, 0)
          Return
       EndIf   
       h_WinShutdown = 0
    Endif
    # дескриптор монитора окна ТС
    Local hMon = DllCall("MonitorFromWindow", "hwnd", AUTORUN_TCHANDLE, "dword", 2)
    # информация о масштабировании экрана
    Local nMonScale = 0, nTextScale
    DllCall("Shcore.dll\GetScaleFactorForMonitor", "hwnd", hMon, "dword*", @nMonScale)
    If nMonScale < 100 Then nMonScale = 100
    # информация о размере текста
    RegRead nTextScale "HKCU\Software\Microsoft\Accessibility" "TextScaleFactor" 100
    nTextScale = Round(nTextScale/100,2)
    Local nWidth = Round(3*nMonScale*nTextScale,0)
    h_WinShutdown = DllCall("CreateWindowExW", _
                            "dword", 0, _
                            "wstr", "msctls_progress32", _
                            "wstr", "", _
                            "dword", 0x10C80000, _
                            "int", 200, "int", 100, "int", Round(Scale(300)*nTextScale,0), "int", Scale(50), _
                            "handle", , _
                            "handle", 0, "handle", 0, "ptr", 0, _
                            "handle")
                   
    If h_WinShutdown = 0 Then Return 0
    
    WinSetState(30, h_WinShutdown)
    WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"))
    g_WinShutdown = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
                            "hwnd", h_WinShutdown, _
                            "int", -4, _
                            "long_ptr", o_WinShutdown.Ptr, _
                            "ptr")  
    
    hIco = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0)                     
    SendMessage(h_WinShutdown, 0x80, 0, hIco)       
                   
    g_Shutdown = 1           
    WinSetStyle(PBS_MARQUEE, 4, h_WinShutdown) 
    SendMessage(h_WinShutdown, PBM_SETPOS, 0, 0)   
    For i = 1 to 100
        SendMessage(h_WinShutdown, PBM_SETPOS, i, 0) 
        WinSetText("Выключение через " & 100-i & " сек.", h_WinShutdown)
        Sleep(900)
        If g_Shutdown = 0 Then Break
    Next 
       
    If g_Shutdown = 0 Then 
       MsgBox("Выключение ПК отменено", "", 48)
    Else       
       If DllCall("DestroyWindow", "handle", h_WinShutdown) Then h_WinShutdown = 0
       MsgBox("Выключение ПК", "", 64)
       #ShellExec("shutdown", "/s /t 60") # можно добавить /f для принудительного закрытия приложений
    EndIf   
EndFunc

# Ctrl+Alt+O
SetHotkeyAction /K:C /K:A /H:O /DM "RunThread" "CopyMonitor"

Global g_CopyMonitor = false

Func CopyMonitor()
    Static hCopyWnd = 0
    # Если монитор уже запущен - остановить
    If g_CopyMonitor Then 
       g_CopyMonitor = false
       Return
    EndIf   
    hCopyWnd = WinFind(0, "TDLG2FILEACTIONMIN")
    If hCopyWnd = 0 Then
        ShowHint("Копирование не запущено", 0, 0, 1000, 1)
        WinAlign(LAST_HINT_WINDOW)
        Return
    EndIf
    g_CopyMonitor = true
    # установка значения прозрачности    
    WinSetStyle(0x80000, 3)
    DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _ 
                                          "ptr", 0, "byte", 192, "dword", 2)
    #параметры подсказки                                      
    SetHintParam("ShowHint", "Font", 15, "Arial")
    SetHintParam("ShowHint", "BackColor", 0xFF0000)
    SetHintParam("ShowHint", "Text", 0xFFFFFF)
    ShowHint("Монитор выключения запущен, ожидание завершения копирования", 0, 0, 1000, 1)
    SetHintParam("ShowHint", "Reload")    
    WinAlign(LAST_HINT_WINDOW)
    While hCopyWnd <> 0
        For i = 1 To 10
            If Not g_CopyMonitor Then Break
            Sleep(100)
        Next
        If Not g_CopyMonitor Then Break
        hCopyWnd = WinFind(0, "TDLG2FILEACTIONMIN")
    Wend
    If g_CopyMonitor Then
       g_CopyMonitor = false
       WinShutdown()
    Else
       SetHintParam("ShowHint", "Font", 15, "Arial")
       SetHintParam("ShowHint", "BackColor", 0xFF0000)
       SetHintParam("ShowHint", "Text", 0xFFFFFF)    
       ShowHint("Монитор выключения остановлен", 0, 0, 1000, 1)
       SetHintParam("ShowHint", "Reload") 
       WinAlign(LAST_HINT_WINDOW)
    EndIf
    WinSetStyle(0x80000, 9)
    DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _ 
                                          "ptr", 0, "byte", 255, "dword", 2)
EndFunc
[/cut]
Loopback писал(а):Надо же, уже 200 страниц наговорили
Успокойтесь, сэр. Мы только начали )
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Orion9 писал(а):Работает, но отчасти. Наверное, для полноты картины нужно AUTORUN_TCHANDLE снять с владельца. Кстати, вот действительно полный код для тех, кто будет пользоваться или развивать его дальше, в предыдущий раз я как всегда забыл про "шапку":
Огромное спасибо, работает, теперь ещё и красиво :!:
Но есть непреодолимое препятствие, чтоб оно сработало самостоятельно.
После счетчика до 100 секунд выскакивает Windows окошко
"Выключение ПК" и пока не нажать OK, дальше дело не идет.
Я закомментировал эту строку

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

MsgBox("Выключение ПК", "", 64)
для практического использования она скорее и не нужна. Без этой строки всё нормально.

Подскажите пожалуйста ещё, как окно счетчика чучуть подвинуть вправо и вверх от центра экрана или лучше не трогать?
Не смог понять.

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

Loopback
я использовал из справки вот этот метод сделать TC полноэкранно через нажатие F11
[cut]

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

Управление окнами
Здесь представлены примеры управления элементами главного окна или диалогов в течении сессии. 

Скачать последнюю версию TCFS2Tools можно здесь. 

LoadLibrary Plugins\TCFS2Tools.dll
LoadLibrary Plugins\Autorun_Tweaks.dll
LoadLibrary Plugins\Autorun_Runtime.dll
LoadLibrary Plugins\Autorun_Sysinfo.dll
 
# Автор — Flasher
 
# F11 — переключение в зависимости от наличия заголовков панелей
#       между полноэкранным режимом (только вкладки)  и исходным
 
# В каталоге плагина будет сохранён Layout.ini с соответствующей секцией
# основного файла для восстановления отображения необходимых компонентов
# при повторных нажатиях горячей клавиши, если таковые оказались скрыты.
# При указании параметра 0 размер окна меняться не будет.
 
SetHotKeyAction /H:F11 ToggleFullScreen
 
WinGetPos('cX', 'cY', 'cW', 'cH')
If Not FileExist(AUTORUN_PATH & '\Layout.ini') Then
   ShellExec /SW_HIDE /WAIT %ComSpec% '/q/c echo [Layout]>%AUTORUN_PATH%\Layout.ini'
   Local sLayout = IniReadSection('~/R', COMMANDER_INI, 'Layout')
   If StrPos(sLayout, '=') Then _
   IniWriteSection(AUTORUN_PATH & '\Layout.ini', 'Layout', sLayout)
Else
   Local sLayout = IniReadSection(AUTORUN_PATH & '\Layout.ini', 'Layout')
   If StrPos(sLayout, '=') Then _
   IniWriteSection('~/R', COMMANDER_INI, 'Layout', sLayout)
EndIf
 
Func ToggleFullScreen(WinChange=1)
   IniRead HasCurDir %COMMANDER_INI% 'Layout' 'CurDir'
   If HasCurDir Then SendMessage(AUTORUN_TCHANDLE, 11, 0)
   If WinChange Then
      Static wAreaX1 = SystemParametersInfo(48, 1), _
             wAreaY1 = SystemParametersInfo(48, 2), _
             wAreaX2 = SystemParametersInfo(48, 3), _
             wAreaY2 = SystemParametersInfo(48, 4)
      If HasCurDir Then
         Static wX = wAreaX1 ? wAreaX1 + 1 : 0, _
                wY = wAreaY1 ? wAreaY1 + 1 : 0, _
                wW = wAreaX2 = SYSINFO_DESKTOPWIDTH  ? wAreaX2 - wAreaX1 - 1 : wAreaX2 - wAreaX1, _
                wH = wAreaY2 = SYSINFO_DESKTOPHEIGHT ? wAreaY2 - wAreaY1 - 1 : wAreaY2 - wAreaY1
         If WinGetState(6) Then WinSetState(9)
         WinSetPos(wX, wY, wW, wH)
      Else
         If WinGetState(6) Then WinSetState(9)
         If cX <> '' Then WinSetPos(cX, cY, cW, cH)
      EndIf
   EndIf
   If HasCurDir Then
      HasMainHeader = WinHasStyle(12582912)
      PostMessage(AUTORUN_TCHANDLE, 1075, 65538)
      IniRead HasTabHeader %COMMANDER_INI% 'Layout' 'TabHeader'
      IniRead HasStatusBar %COMMANDER_INI% 'Layout' 'StatusBar'
      IniRead HasDriveList %COMMANDER_INI% 'Layout' 'DriveCombo'
      IniRead HasKeyButtons %COMMANDER_INI% 'Layout' 'KeyButtons'
      IniRead HasCmdLine %COMMANDER_INI% 'Layout' 'CmdLine'
      IniRead HasDriveBar %COMMANDER_INI% 'Layout' 'DriveBar1'
      IniRead HasButtonBar %COMMANDER_INI% 'Layout' 'ButtonBar'
      IniRead HasButtonBar2 %COMMANDER_INI% 'Layout' 'ButtonBarVertical'
      SendCommand 2902 2
      SendCommand 2906 2
      SendCommand 2907 2
      SendCommand 2908 2
      SendCommand 2909 2
      SendCommand 2910 2
      SendCommand 2911 2
      SendCommand 2944 2
      SendCommand 2901 2
      WinSetStyle 12582912 4
   Else
      PostMessage(AUTORUN_TCHANDLE, 1075, 65537)
      If HasButtonBar  Then SendCommand 2901 1
      If HasDriveBar   Then SendCommand 2902 1
      If HasDriveList  Then SendCommand 2906 1
      SendCommand 2907 1
      If HasTabHeader  Then SendCommand 2908 1
      If HasStatusBar  Then SendCommand 2909 1
      If HasCmdLine    Then SendCommand 2910 1
      If HasKeyButtons Then SendCommand 2911 1
      If HasButtonBar2 Then SendCommand 2944 1
      If HasMainHeader Then WinSetStyle 12582912 2
   EndIf
   SendCommand 2918
   If HasCurDir Then SendMessage(AUTORUN_TCHANDLE, 11, 1)
   WinRedRaw 2
EndFunc
 
Pragma AutorunFinalizeSection
 
If FileExist(AUTORUN_PATH & '\Layout.ini') Then
   sLayout = IniReadSection(AUTORUN_PATH & '\Layout.ini', 'Layout')
   If StrPos(sLayout, '=') Then
      IniWriteSection('~/R', COMMANDER_INI, 'Layout', sLayout)
      Sleep(20)
   EndIf
EndIf
[/cut]
по F11 входит в полноэкранный режим, но когда обратно хочу в обычный, после нажатия F11 выскакивает ошибка
[cut]Изображение[/cut]
успевает появиться обратно только панель меню, Файлы_Выделение_Навигация_и_т.д.
Можно ли сделать, чтоб оно сразу выполняло вход в полноэкранный режим при старте TC?
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а): возможность масштабировать экран из настроек Windows появилась не только с Win8?
В семерке точно есть, да и в XP кажется уже было. Другое дело, что масштабирование работало мягко говоря так себе.
A55555 писал(а):Подскажите пожалуйста ещё, как окно счетчика чучуть подвинуть вправо и вверх от центра экрана или лучше не трогать?
Добавьте три параметра в функцию WinAlign, как в коде ниже, и попробуйте выделенные значения (это смещения от установленной позиции) менять как будет удобно.

WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"), 0, 100, -100)
A55555 писал(а):после нажатия F11 выскакивает ошибка
Поправил переменные и умолчания настроек, вроде сейчас работает.

[cut]

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

LoadLibrary Plugins\TCFS2Tools.dll
LoadLibrary Plugins\Autorun_Tweaks.dll
LoadLibrary Plugins\Autorun_Runtime.dll
LoadLibrary Plugins\Autorun_Sysinfo.dll
 
# Автор — Flasher
 
# F11 — переключение в зависимости от наличия заголовков панелей
#       между полноэкранным режимом (только вкладки)  и исходным
 
# В каталоге плагина будет сохранён Layout.ini с соответствующей секцией
# основного файла для восстановления отображения необходимых компонентов
# при повторных нажатиях горячей клавиши, если таковые оказались скрыты.
# При указании параметра 0 размер окна меняться не будет.

SetHotKeyAction /H:F11 ToggleFullScreen
 
WinGetPos('cX', 'cY', 'cW', 'cH')
If Not FileExist(AUTORUN_PATH & '\Layout.ini') Then
    ShellExec /SW_HIDE /WAIT %ComSpec% '/q/c echo [Layout]>%AUTORUN_PATH%\Layout.ini'
    Local sLayout = IniReadSection('~/R', COMMANDER_INI, 'Layout')
    If StrPos(sLayout, '=') Then _
    IniWriteSection(AUTORUN_PATH & '\Layout.ini', 'Layout', sLayout)
Else
    Local sLayout = IniReadSection(AUTORUN_PATH & '\Layout.ini', 'Layout')
    If StrPos(sLayout, '=') Then _
    IniWriteSection('~/R', COMMANDER_INI, 'Layout', sLayout)
EndIf
 
Func ToggleFullScreen(WinChange=1)
    Static HasTabHeader, HasStatusBar, HasDriveList, HasKeyButtons, HasCmdLine, _
           HasDriveBar, HasButtonBar, HasButtonBar2, HasMainHeader
   
    IniRead /R HasCurDir %COMMANDER_INI% 'Layout' 'CurDir'
    If HasCurDir Then SendMessage(AUTORUN_TCHANDLE, 11, 0)
    If WinChange Then
        # SPI_GETWORKAREA - desktop area without taskbar
        Static wAreaX1 = SystemParametersInfo(48, 1), _
               wAreaY1 = SystemParametersInfo(48, 2), _
               wAreaX2 = SystemParametersInfo(48, 3), _
               wAreaY2 = SystemParametersInfo(48, 4)
        If HasCurDir Then
            Static wX = wAreaX1 ? wAreaX1 + 1 : 0, _
                   wY = wAreaY1 ? wAreaY1 + 1 : 0, _
                   wW = wAreaX2 = SYSINFO_DESKTOPWIDTH  ? wAreaX2 - wAreaX1 - 1 : wAreaX2 - wAreaX1, _
                   wH = wAreaY2 = SYSINFO_DESKTOPHEIGHT ? wAreaY2 - wAreaY1 - 1 : wAreaY2 - wAreaY1
            If WinGetState(6) Then WinSetState(9)
            WinSetPos(wX, wY, wW, wH)
        Else
            If WinGetState(6) Then WinSetState(9)
            If cX <> '' Then WinSetPos(cX, cY, cW, cH)
        EndIf
    EndIf

    If HasCurDir Then
        HasMainHeader = WinHasStyle(12582912)
        PostMessage(AUTORUN_TCHANDLE, 1075, 65538)
        IniRead /R HasTabHeader %COMMANDER_INI% 'Layout' 'TabHeader' 1
        IniRead /R HasStatusBar %COMMANDER_INI% 'Layout' 'StatusBar' 1
        IniRead /R HasDriveList %COMMANDER_INI% 'Layout' 'DriveCombo' 1
        IniRead /R HasKeyButtons %COMMANDER_INI% 'Layout' 'KeyButtons' 1
        IniRead /R HasCmdLine %COMMANDER_INI% 'Layout' 'CmdLine' 1
        IniRead /R HasDriveBar %COMMANDER_INI% 'Layout' 'DriveBar1' 0
        IniRead /R HasButtonBar %COMMANDER_INI% 'Layout' 'ButtonBar' 1
        IniRead /R HasButtonBar2 %COMMANDER_INI% 'Layout' 'ButtonBarVertical' 1
        SendCommand 2902 2
        SendCommand 2906 2
        SendCommand 2907 2
        SendCommand 2908 2
        SendCommand 2909 2
        SendCommand 2910 2
        SendCommand 2911 2
        SendCommand 2944 2
        SendCommand 2901 2
        WinSetStyle 12582912 4
    Else
        PostMessage(AUTORUN_TCHANDLE, 1075, 65537)
        If HasButtonBar  Then SendCommand 2901 1
        If HasDriveBar   Then SendCommand 2902 1
        If HasDriveList  Then SendCommand 2906 1
        SendCommand 2907 1
        If HasTabHeader  Then SendCommand 2908 1
        If HasStatusBar  Then SendCommand 2909 1
        If HasCmdLine    Then SendCommand 2910 1
        If HasKeyButtons Then SendCommand 2911 1
        If HasButtonBar2 Then SendCommand 2944 1
        If HasMainHeader Then WinSetStyle 12582912 2
    EndIf
    SendCommand 2918
    If HasCurDir Then SendMessage(AUTORUN_TCHANDLE, 11, 1)
    WinRedRaw 2
EndFunc
 
Pragma AutorunFinalizeSection
 
If FileExist(AUTORUN_PATH & '\Layout.ini') Then
    sLayout = IniReadSection(AUTORUN_PATH & '\Layout.ini', 'Layout')
    If StrPos(sLayout, '=') Then
        IniWriteSection('~/R', COMMANDER_INI, 'Layout', sLayout)
        Sleep(20)
    EndIf
EndIf
[/cut]

Но если что, код не мой, его автор присутствует на оффоруме ghisler.ch.

A55555 писал(а):Можно ли сделать, чтоб оно сразу выполняло вход в полноэкранный режим при старте TC?
Добавьте вызов ToggleFullScreen после инициализации, вот тут:

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

    Local sLayout = IniReadSection(AUTORUN_PATH & '\Layout.ini', 'Layout')
    If StrPos(sLayout, '=') Then _
    IniWriteSection('~/R', COMMANDER_INI, 'Layout', sLayout)
EndIf

# переход в полноэкранный режим при старте
ToggleFullScreen() 
 
Func ToggleFullScreen(WinChange=1)
    Static HasTabHeader, HasStatusBar, HasDriveList, HasKeyButtons, HasCmdLine, _
           HasDriveBar, HasButtonBar, HasButtonBar2, HasMainHeader
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

A55555
Правильно сделали, что закомментировали ту строку, она была только для тестов и отладки.
A55555 писал(а):Подскажите пожалуйста ещё, как окно счетчика чучуть подвинуть вправо и вверх от центра экрана или лучше не трогать?
Вверх - понять могу, но почему вправо? Окно и правда смотрится чуть ниже центра из-за выравнивания по рабочему столу без учета панели задач. Loopback уже предложил решение, но как альтернативный вариант окно можно приподнять функцией WinSetPos. Если позиция будет неоднократно меняться, лучше не использовать флаг WS_VISIBLE при создании окна функцией CreateWindowExW (т.е. станет 0x00C80000 вместо 0x10C80000), а делать его видимым только после всех манипуляций. Вот такой альтернативный вариант вполне приемлим:

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

    h_WinShutdown = DllCall("CreateWindowExW", _
                            "dword", 0, _
                            "wstr", "msctls_progress32", _
                            "wstr", "", _
                            "dword", 0x00C80000, _
                            "int", 200, "int", 100, "int", Round(Scale(300)*nTextScale,0), "int", Scale(50), _
                            "handle", , _
                            "handle", 0, "handle", 0, "ptr", 0, _
                            "handle")
                   
    If h_WinShutdown = 0 Then Return 0
    # поверх всех окон
    WinSetState(30, h_WinShutdown)
    # выравнивание по центру рабочего стола    
    WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"))
    # перемещение окна вверх на 50 пикселей    
    WinSetPos("", -Scale(50), "", "", 1, h_WinShutdown)
    # перемещение окна вправо на 50 пикселей
    # WinSetPos(Scale(50), "", "", "", 1, h_WinShutdown)
    # показ окна    
    WinSetState(5, h_WinShutdown)
Если нужен сдвиг вправо, то за него отвечает отдельная строка.

Вообще-то, функционал классный получается, но пока он еще далек от завершения. Как было справедливо отмечено, нужна дополнительная обработка различных сценариев (неожиданное завершение операции, непредвиденные диалоговые окна, кнопка "В фоне" и т.д.), и это нормально. Иногда требуется 1-2 месяца, чтобы довести все до ума, это еще при частом использовании, а не редком.
A55555 писал(а):Надеюсь кроме меня ещё кому-то пригодится.
Сейчас заметил, что "Return" немного не туда поставил, что приводит к появлению подсказки при старте ТС, даже если прозрачность отключена и не используется. Лучше заменить на другой фрагмент:

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

 If nAction = 0 Then        
       IniRead transp %COMMANDER_INI% "Autorun" "Transparency" 255
       If transp >= 100 And transp < 255 Then
          WinSetStyle(0x80000, 3)
          DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _ 
                                         "ptr", 0, "byte", transp, "dword", 2)
       EndIf
       Return
    EndIf   
Вообще, Autorun позволяет добавить кучу уникальных фич, которые сам Гислер вряд ли будет когда-то делать. Где-то полгода назад я собирал интересные скрипты, вот перезаливка. С тех пор еще поднакопилось, и когда будет время, обязательно выложу. Например, летом активно юзал подсчет времени у аудио и видео файлов. Гислера тоже просили добавить эту фичу, но когда он ее сделает, не известно. А может и вовсе не сделает. Если вдруг интересно, то вот, прикладываю сразу с подсчетом торрент-файлов:
[cut]

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

RegisterCommand 62013 "Duration"

Global MI_DURATION = 0, MI_BREAK = false

Func Duration(lParam)
    If MI_DURATION > 0 Then
       MI_BREAK = true
       Sleep(250)
       Return
    EndIf
    RunThread DurationInfo
EndFunc

Func DurationInfo()
    Local T1 = GetUptime(), T2 = T1
    Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10), b_Alt = IsPressed(0x12)
    Local b_Caps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
    Local hMI = 0
    Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll", _
           hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs" & sLib, "ptr")
    Static sExt = ".aac .ac3 .aif .aiff .aifc .afc .ape .au .snd .cda .dsf .dts .dtswav .dtshd .dtsma .eac3 _
                   .flac .fla .m1a .m2a .mka .mpa .mp1 .mp2 .mp3 .mp4 .m4a .m4b .m4r .mod .mpc .mp+ .mpp _
                   .oga .ogx .ogg .ra .spx .opus .qoa .svx .8svx .tak .tta .wav .wave .w64 .bwf .rf64 .wma .wv _
                   .avi .wmv .wmp .wm .asf .mpg .mpeg .mpe .m1v .m2v .mpv2 .mp2v .ts .tp .tpr .trp .vob .ifo _
                   .ogm .ogv .mp4 .m4v .m4p .m4b .3gp .3gpp .3g2 .3gp2 .mkv .rm .ram .rmvb .rpm .flv .swf .mov _
                   .qt .amr .nsv .dpg .m2ts .m2t .mts .dvr-ms .k3g .skm .evo .nsr .amv .divx .webm .wtv .f4v .mxf"
    If Not b_Alt Then           
       If hLib = 0 Then 
          ShowHint("Error LoadLibrary " & sLib)
          Return 
       EndIf
       hMI = DllCall(sLib & '\MediaInfo_New', "Ptr")
       If hMI = 0 Then 
          ShowHint("MediaInfo.dll failed to create new object")
          Return
       Endif
    Else     
       Local obj = Plugin("TCMediaInfo")
       If ERROR <> 0 Then
          ShowHint("TCMediaInfo.wdx plugin error " & ERROR)
          Return
       Endif
    EndIf
    Local s = 0
    Local aSel = List()
          aSel.Text = GetSelectedItems(3, 0)       
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    If aSel.Count = 0 Then
       If Not FileExist(sFile) Then 
          ShowHint("Файл не существует " & sFile)
          Free(aSel)
          Return
       Endif
    EndIf       
    If aSel.Count = 0 And Not StrPos(FileGetAttr(sFile), "D") Then
       Free(aSel)
       If b_Alt Then
          obj.FileName = sFile     
          s = obj.GetValue(0)	# duration
          Free(obj)
       Else
          If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", sFile, "uint") <> 1 Then
             Return ShowHint("MediaInfo.dll failed to open file " &  sFile)                            
          EndIf
          s = DllCall(sLib & '\MediaInfo_Get', _
              'ptr', hMI, "int", 0, "int", 0, "wstr", "Duration/String3", "int", 1, "int", 0, "wstr")
       EndIf   
       Return ShowHint("Файл: " & sName & auCRLF & "Длительность: " & s) 
    Endif
    ShowHint("Загрузка")
    MI_BREAK = false
    MI_DURATION = 1    
    Local i, j, k, dirs = 0, files = 0, errs = 0, item = 0, aFiles = List(), seconds = 0, b_Hint = 0
    Local depth = (b_Ctrl ? 1 : 0)  
    b_Win = false
    # загрузка файлов в массив    
    If aSel.Count > 0 Then
       For j = 0 To aSel.Count - 1
          sFile = sPath & aSel[j]
          If FileExist(sFile) Then 
             k += 1
             aFiles.Add(sFile)
             If StrPos(FileGetAttr(sFile), "D") Then ListDirectory(sFile, aFiles, depth)
          EndIf   
       Next
       sName = "S/A: " & aSel.Count & "/" & k	# Selected / Available
    Else
       aFiles.Add(sFile)
       ListDirectory(sFile, aFiles, depth)
    EndIf
    Free(aSel)
    If aFiles.Count > 1 Then
       ShowHint("Depth: " & depth & auCRLF & _
                "CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
                (b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
                "Элементов: " & aFiles.Count & auCRLF & _                     
                "Подсчёт времени...")
    EndIf
    T2 = GetUptime()
    For i = 0 To aFiles.Count - 1
        If b_Win Then OutputDebugString("Duration.File:" & aFiles[i])
        If StrPos(FileGetAttr(aFiles[i]), "D") Then
           dirs += 1
           If b_Shift Then OutputDebugString("Duration.Directory:" & aFiles[i])
           Continue 
        EndIf
        item += 1    
        If b_Alt Then
           obj.FileName = aFiles[i]
           s = obj.GetValue(0,3)	# duration -> milliseconds
        Else
           ext = FileGetExt(aFiles[i])
           If Not b_Caps Then
              If Not StrPos(sExt, '.' & ext) Then 
                  If b_Shift Then OutputDebugString("Duration.Filter:" & aFiles[i])
                 Continue
              EndIf
           EndIf
           If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", aFiles[i], "uint") <> 1 Then
              errs += 1
              If b_Shift Then OutputDebugString("Duration.Error:" & aFiles[i])
              Continue        
           EndIf
           s = DllCall(sLib & '\MediaInfo_Get', _
               'ptr', hMI, "int", 0, "int", 0, "wstr", "Duration", "int", 1, "int", 0, "wstr")
        EndIf
        If s > 0 Then
           seconds += s
           files += 1
        Else
           If b_Shift Then OutputDebugString("Duration.Empty:" & aFiles[i])
        EndIf
        If MI_BREAK = true Or (IsPressed (0x11) And IsPressed (0x1B)) Then
           ShowHint("Операция прервана")
           Sleep(500)
           Break
        EndIf
        #If Not (IsPressed(0x11) And IsPressed(0x12)) Then
        If IsPressed(0x10) Then
           b_Hint += 1
           If Round(GetUptime() - T2, 0) > 500 Then
              ShowHint( _
                         (b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
                         "CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
                         "Depth: " & depth & auCRLF & _
                         "File: " & i & " of " & aFiles.Count _
                       )
              T2 = GetUptime()
            EndIf
        Else 
            If b_Hint > 0 Then
               b_Hint = 0
               ShowHint("Depth: " & depth & auCRLF & _
                        "CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
                        (b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
                        "Элементов: " & aFiles.Count & auCRLF & _                     
                        "Подсчёт времени...")
            EndIf 
        EndIf             
    Next    
    If b_Alt Then Free(obj)
    If hMI <> 0 Then DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
    MI_BREAK = false
    MI_DURATION = 0
    seconds = Floor(seconds / 1000)
    Local day = Floor(seconds / 86400)
    Local hour = Floor((seconds - (day * 86400)) / 3600)
    Local min = Floor(((seconds - (day * 86400)) - (hour * 3600)) / 60)
    Local sec = seconds - (day * 86400 + hour * 3600 + min * 60)
    Local total = StrFormat("%02d:%02d:%02d:%02d",day,hour,min,sec)
    Local tl = Round(GetUptime() - T1, 0) / 1000 
    Local txt = "Имя: " & sName & auCRLF & _
                "Каталогов: " & dirs & auCRLF & _    
                "Элементов: " & aFiles.Count & auCRLF & _
                "Обработано: " & files & " из " & item & auCRLF & _
                "Ошибки DLL: " & errs & auCRLF & _
                "Секунды: " & seconds & auCRLF & _
                "Минуты: " & Round(seconds / 60, 2) & auCRLF & _
                "Часы: " & Round(seconds / 3600, 2) & auCRLF & _
                "Сутки: " & Round(seconds / 86400, 2) & auCRLF & _             
                "Время: " & Chr(0x2211) & " "& total & auCRLF & _
                "Powered by " & (b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
                "Время операции: " &  StrFormat("%.3f", tl) & " sec"
    Free(aFiles)
    ClipPut(txt)
    ShowHint(txt)
EndFunc

RegisterCommand 62014 "TorrentSize"

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
       Return ShowHint("" & sName & auCRLF & _
                       "Размер: " & SizeFormat(size, 1, 'G', 2, 1) & auCRLF & _
                       "Файлов: " & files) 
    EndIf
    Local tl = Round(GetUptime() - T1, 0) / 1000
    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")
    Free(obj, aSel)    
EndFunc
[/cut]
[cut="Кнопка"]

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

TOTALCMD#BAR#DATA
62013

%COMMANDER_EXE%
Подсчёт времени воспроизведения|Alt - Использовать TCMediaInfo.wdx|Ctrl - Глубина каталога = 1|Shift - Вывод информации в отладчик|CapsLock - Отключить фильтр расширений

0
-1
[/cut]
[cut="Кнопка"]

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

TOTALCMD#BAR#DATA
62014

%COMMANDER_EXE%
Подсчёт размера .torrent файлов

0
-1
[/cut]
Поменяйте только путь к библиотеке MediaInfo.dll, у меня это "COMMANDER_PATH & "\Ini\Tools\Libs". И желательно иметь установленные плагины TCMediaInfo и TCTorrent от Loopback. Во время подсчета, если операция длительная, работает клавиша SHIFT, отображающая прогресс операции в текстовом виде. Подсчет размера торрент-файлов менее востребованная фишка, но если, например, диски под завязку, а файлы имеются, бывает необходимость прикинуть, сколько места они могут занять. Я, к примеру, сталкивался с таким.

А что касается полного экрана, то, разумеется, я видел этот код от Flasher, однако попробовать и обкатать его руки не дошли. У себя я использую TCFS2 для этих целей уже много лет, но со временем доберусь и до Autorun.

Кстати, полный экран не обязательно вызывать только горячей клавишей, можно сделать и в верхнем меню соответсвующую кнопку, тоже будет удобно. В файле меню после HELP_BREAK вставить MENUITEM ":::", em_FullScreen, где em_FullScreen - пользовательская команда для вызыва TCFS2. Возможно, вы знали о таком использовании, но так, на всякий случай написал.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Версия Autorun 2.2.20 beta

[cut="История изменений"]

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

- Runtime: функция WinAlign работала некорректно, если окна свёрнуты
* Sysinfo: переменные SYSINFO_DESKTOP* теперь реализованы макросами
+ Sysinfo: добавлен макрос SYSINFO_DESKTOPDPI
+ окно для внешнего взаимодействия, макрос AUTORUN_WINDOW
- исправлен неправильный формат даты и времени при указании только строки формата
* внутренняя оптимизация GetState
- задание кодировки в виде CP:xxxx не работало
- очередной раз улучшена стабильность появления сообщений об ошибках под x64
- исправлено копирование файлов в существующий каталог с FileCopy
- Tweaks: более точное определение границ функциональных клавиш в ControlSetMouseAction
+ новый плагин RegExp, функции RegExpPos, RegExpGet, RegExpReplace, объект RegExp
+ Tweaks: расширенный формат пунктов меню для ShowPopupMenu
- исправлена установка размера буфера в параметрах DllCall (регресс с версии 2.2.17)
* ВАЖНО: для корректной работы указанных ниже функций необходимы актуальные версии плагинов Process и Runtime
* API: изменения в механизме возврата длинного текста в GetSelectedItems, ProcessExecGetOutput и ClipGet
[/cut]

Как обычно, сложно сосредоточиться только на правке багов и оптимизации, когда остаются нужные и интересные задачи. В этой версии закрыл ещё три пункта, которые давно висели в todo.

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

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

В этом обновлении пришлось сделать небольшие изменения в API плагинов. Это "ломающее" изменение, но затрагивает оно только добавленную в двух прошлых версиях возможность возврата длинного текста в некоторых функциях. Чтобы не было проблем, достаточно чтобы версии плагинов Process и Runtime были актуальные, на их старых версиях с новой версией Autorun текст по прежнему будет обрезаться. Изменение затрагивает только три функции: ProcessExecGetOutput, GetSelectedItems и ClipGet.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

+ новый плагин RegExp, функции RegExpPos, RegExpGet, RegExpReplace, объект RegExp
Ура!
Amo ergo sum
A55555
Сообщения: 72
Зарегистрирован: Вс фев 06, 2011 10:50

Сообщение A55555 »

Loopback писал(а):Добавьте три параметра в функцию WinAlign, как в коде ниже, и попробуйте выделенные значения (это смещения от установленной позиции) менять как будет удобно.

WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"), 0, 100, -100)

Поправил переменные и умолчания настроек, вроде сейчас работает.


Добавьте вызов ToggleFullScreen после инициализации, вот тут:

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

# переход в полноэкранный режим при старте
ToggleFullScreen() 
 
Func ToggleFullScreen(WinChange=1)
    Static HasTabHeader, HasStatusBar, HasDriveList, HasKeyButtons, HasCmdLine, _
           HasDriveBar, HasButtonBar, HasButtonBar2, HasMainHeader
Большое спасибо.
Все работает.
Orion9 писал(а):Вверх - понять могу, но почему вправо? Окно и правда смотрится чуть ниже центра из-за выравнивания по рабочему столу без учета панели задач. Loopback уже предложил решение, но как альтернативный вариант окно можно приподнять функцией WinSetPos. Если позиция будет неоднократно меняться, лучше не использовать флаг WS_VISIBLE при создании окна функцией CreateWindowExW (т.е. станет 0x00C80000 вместо 0x10C80000), а делать его видимым только после всех манипуляций. Вот такой альтернативный вариант вполне приемлим:
Если нужен сдвиг вправо, то за него отвечает отдельная строка.
Спасибо. Работает, если не активировать строку сдвига вправо.
При активации строки сдвига вправо окно счетчика не появляется поверх всех окон.
Мне для тестов так удобнее чуть вправо чтоб появлялось.
Orion9 писал(а):Сейчас заметил, что "Return" немного не туда поставил, что приводит к появлению подсказки при старте ТС, даже если прозрачность отключена и не используется. Лучше заменить на другой фрагмент:
Сменил. Но именно у меня никакой лишней подсказки не выскакивало и в предыдущем варианте. Прозрачность активирована.
Orion9 писал(а):Вообще, Autorun позволяет добавить кучу уникальных фич, которые сам Гислер вряд ли будет когда-то делать. Где-то полгода назад я собирал интересные скрипты, вот перезаливка. С тех пор еще поднакопилось, и когда будет время, обязательно выложу. Например, летом активно юзал подсчет времени у аудио и видео файлов. Гислера тоже просили добавить эту фичу, но когда он ее сделает, не известно. А может и вовсе не сделает. Если вдруг интересно, то вот, прикладываю сразу с подсчетом торрент-файлов:
Спасибо.
TCMediaInfo и TCTorrent в моей сборке TC по умолчанию включены, путь указал для MediaInfo.dll
Я попробовал под вашей копией TC, у себя пока не смог прикрутить. У меня опыта прикручивания готовых кнопок нет, поучусь.
Последний раз редактировалось A55555 Вс сен 07, 2025 23:39, всего редактировалось 1 раз.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback
Топчик, как всегда )

Спасибо, что добавили копию материала по регулярным выражениям сразу в справку. Теперь придется снова заряжаться кофе и кокосовым молоком по утрам )

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

Внешнее взаимодействие - шикарно просто. В общем, большое спасибо за очередную версию!

yozhik
Всё стесняюсь поинтересоваться. У вас нет планов обновить хайлайтер синтаксиса Autorun на AkelPad? Там ведь много чего добавилось.
A55555 писал(а):При активации строки сдвига вправо окно счетчика не появляется поверх всех окон.
Я больших тестов не проводил, но вроде бы у меня работало без проблем. Даже не знаю, в чем может быть причина.
A55555 писал(а):Мне для тестов так удобнее чуть вправо чтоб появлялось.
Понял теперь.
A55555 писал(а):Сменил. Но именно у меня никакой лишней подсказки не выскакивало и в предыдущем варианте.
Она просто появляется у указателя мыши, я ее тоже не сразу заметил, поэтому и пропустил в первом варианте кода.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Loopback писал(а):- очередной раз улучшена стабильность появления сообщений об ошибках под x64
Проверил на текущей сборке. Вроде все нормально, окно сообщения больше не улетает за экран. Но тестовую сборку я давно грохнул. Поэтому не отвечаю за результат. А у вас не сохранилась моя тестовая сборка? Хотелось-бы не ней проверить, чтобы успокоиться.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

AkulaBig писал(а):Проверил на текущей сборке. Вроде все нормально, окно сообщения больше не улетает за экран.
Нет, та проблема с улетанием окна осталась не исправленной до конца, повторить я её так и не смог. Поставил проверку, которая исправляет внешние проявления, но не корень проблемы, поэтому я даже в историю ее забыл добавить. Если открыть DebugView и посмотреть, то при возникновении той ошибки будет выводиться сообщение "'Unable to get TC window rect, use desktop". Попробуйте, скорее всего и на текущей сборке проявится. Но если что - сборка осталась, при необходимости выложу.

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

Сообщение Orion9 »

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

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

buf.SetStr(pipe, 0, nSize, "CP:28591")
Это классно.

А так, установил пока новую версию, вроде работает, но нужно, больше тестов, конечно.
A55555 писал(а):У меня опыта прикручивания готовых кнопок нет, поучусь.
Не совсем понятно, что имеется в виду. Про копипрование кода кнопок на панель инструментов вы, наверное, знаете. А чтобы вызывать функции Autorun из кнопок ТС, для этого, как правило, регистрируется отдельный незанятый код в диапазоне 60000-100000 и указывается в соответствующей кнопке. Этот код можно использовать и в пользовательских em_командах, например, себе я сделал такую команду в файле usercmd.ini:

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

[em_file_fragments]
cmd=70400
Код 70400 вызывает функцию отображения кластеров в подсказке. Можно вызывать этот код из кнопки, но так будет не очень удобно при частом использовании. Поэтому я создал отдельную em_команду и использую ее при нажатии комбинации CTRL + F, назначенив ее в окне стандартных настроек ТС.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Loopback писал(а):Нет, та проблема с улетанием окна осталась не исправленной до конца, повторить я её так и не смог.
Понятно.
Loopback писал(а):Попробуйте, скорее всего и на текущей сборке проявится.
Не могу я эту ошибку на текущей сборке получить. У меня код изменился очень сильно.
Loopback писал(а):Но если что - сборка осталась, при необходимости выложу.
Если вы утверждаете, что пока ту ошибку не устранили, может и нет смысла. Но на всякий случай лучше выложите куда-нибудь, если не трудно. Буду тестить каждую новую версию.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а): все-таки вылетает иногда, зараза
Увы, идеально точно не получится, ширина кнопок меняется, расчётные значения ширины всё равно плюс-минус один-два пикселя будут гулять.
Orion9 писал(а):Имеется в виду, что теперь будут работать такие записи?
Да, как и было задумано.
AkulaBig писал(а):Не могу я эту ошибку на текущей сборке получить. У меня код изменился очень сильно.
Т.е. в DebugView ничего не пишет? Потому что улетать сейчас окно в любом случае не будет. Но если проблема опять возникнет - кидает отладочное сообщение об этом.
AkulaBig писал(а):Но на всякий случай лучше выложите куда-нибудь, если не трудно.
Залил временно к себе, мне так удобнее чем с обменниками.
Ответить