View previous topic :: View next topic |
Author |
Message |
Orion9

Joined: 01 Jan 2024 Posts: 838
|
(Separately) Posted: Sat Sep 06, 2025 00:42 Post subject: |
|
|
Loopback
Помнится, делал корректировку на масштабирование экрана в подсказке к главной панели инструментов несколько страниц назад, тогда использовал такой метод:
Code: | # дескриптор монитора окна ТС
Local hMon = DllCall("MonitorFromWindow", "hwnd", AUTORUN_TCHANDLE, "dword", 2)
# информация о масштабировании экрана
Local nScale = 0, bRes
bRes = DllCall("Shcore.dll\GetScaleFactorForMonitor", "hwnd", hMon, "dword*", @nScale)
|
Но предложенные вами функции выглядят более основательно, поэтому буду использовать их. Слышал, что для полноты картины нужно ещё учитывать размер текста, который пользователь тоже может увеличить в настройках системы в разделе специальных возможностей. Один из способов - чтение значения из реестра:
Code: | RegRead nTextScale "HKCU\Software\Microsoft\Accessibility" "TextScaleFactor" 100
nTextScale = Round(nTextScale/100,2) |
Далее умножить полученный коэффициент на необходимое значение, т.е.
Code: | 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") |
В общем, вот полный обновленный код всего, что ранее было, включая две разные функции для получения значения масштабирования:  Hidden text Code: | 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 |
Loopback wrote: | В каком смысле затенить? |
Как было в ХР при выключении системы: фон затенялся и становился нецветным, а окно с выбором действия оставалось в цвете поверх него. Но думаю, сейчас это не надо - прозрачность даже лучше. Словно призрак остается от комманндера, стоящий лишь в один шаг от полного исчезновения вместе с системой ))
A55555 wrote: | Но этому окну отсчета напрашивается отображение поверх всех окон. |
Наверное, можно. Надо глянуть. Может, автор плагина ответ уже знает? |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1611
|
(Separately) Posted: Sat Sep 06, 2025 11:56 Post subject: |
|
|
Orion9 wrote: | тогда использовал такой метод |
Понятно, что некоторые вещи можно сделать разными способами. Эта функция дает масштаб в процентах. Наверно и из нее можно пересчитать, но я ей не пользовался. Тут еще минус, что она появилась только в Win 8.1.
Orion9 wrote: | для полноты картины нужно ещё учитывать размер текста |
Отмасштабированное окно обычно содержит достаточно места для текста, если он масштабируется системой. Но если пользователь ещё значительно увеличит шрифт, то да, может и не уместиться. Но это все же редкое явление, нечасто встретишь программу, которая бы корректно реагировала на такое изменение. Я бы с этим заморачивался, только если программа сама позволяет менять размер шрифта в широких пределах.
Orion9 wrote: | Как было в ХР при выключении системы |
Понял. Я не помню, чтобы встречал стандартную функцию для этого. Эффект скорее всего можно повторить с помощью GDI+ (сделать скриншот и обесцветить изображение), но сомневаюсь, что оно того стоит.
Orion9 wrote: | Может, автор плагина ответ уже знает? |
WinSetState(30, h_WinShutdown)
 Hidden text Надо же, уже 200 страниц наговорили
|
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 838
|
(Separately) Posted: Sat Sep 06, 2025 13:31 Post subject: |
|
|
A55555 wrote: | аж захотелось на постоянно добавить окну TC прозрачности немного. |
Как-то вчера прошел мимо этого комментария, а ведь Autorun очень легко может это сделать, даже пугающе легко. Я бы сказал, он создан для таких задач:
Code: | # 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 wrote: | Тут еще минус, что она появилась только в Win 8.1 |
Да, я видел это ограничение. Но с другой стороны, возможность масштабировать экран из настроек Windows появилась не только с Win8?
Loopback wrote: | Но если пользователь ещё значительно увеличит шрифт, то да, может и не уместиться. |
Как я понял, это довольно редкий случай, поэтому и находится он в разделе "Специальные возможности". Но по идее его тоже нужно учитывать и держать в голове. Не уверен, правда, что для функционала Autorun это является актуальным.
Loopback wrote: | WinSetState(30, h_WinShutdown) |
Работает, но отчасти. Наверное, для полноты картины нужно AUTORUN_TCHANDLE снять с владельца. Кстати, вот действительно полный код для тех, кто будет пользоваться или развивать его дальше, в предыдущий раз я как всегда забыл про "шапку":
 Hidden text Code: | 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 |
Loopback wrote: | Надо же, уже 200 страниц наговорили |
Успокойтесь, сэр. Мы только начали ) |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 31
|
(Separately) Posted: Sun Sep 07, 2025 00:18 Post subject: |
|
|
Orion9 wrote: | Работает, но отчасти. Наверное, для полноты картины нужно AUTORUN_TCHANDLE снять с владельца. Кстати, вот действительно полный код для тех, кто будет пользоваться или развивать его дальше, в предыдущий раз я как всегда забыл про "шапку": |
Огромное спасибо, работает, теперь ещё и красиво
Но есть непреодолимое препятствие, чтоб оно сработало самостоятельно.
После счетчика до 100 секунд выскакивает Windows окошко
"Выключение ПК" и пока не нажать OK, дальше дело не идет.
Я закомментировал эту строку
Code: | MsgBox("Выключение ПК", "", 64) |
для практического использования она скорее и не нужна. Без этой строки всё нормально.
Подскажите пожалуйста ещё, как окно счетчика чучуть подвинуть вправо и вверх от центра экрана или лучше не трогать?
Не смог понять.
Orion9 wrote: | Как-то вчера прошел мимо этого комментария, а ведь Autorun очень легко может это сделать, даже пугающе легко. Я бы сказал, он создан для таких задач: |
Класс, спасибо за ваши программные подарки.
Надеюсь кроме меня ещё кому-то пригодится.
Orion9 wrote: | A55555, если вы поставили Autorun, посмотрите еще пример сворачивания в трей в справке, напоминает чем-то изменение прозрачности. |
Попробую найти (пока не хватило ума ) и почитать.
Loopback
я использовал из справки вот этот метод сделать TC полноэкранно через нажатие F11
 Hidden text Code: | Управление окнами
Здесь представлены примеры управления элементами главного окна или диалогов в течении сессии.
Скачать последнюю версию 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 |
по F11 входит в полноэкранный режим, но когда обратно хочу в обычный, после нажатия F11 выскакивает ошибка
 Hidden text
успевает появиться обратно только панель меню, Файлы_Выделение_Навигация_и_т.д.
Можно ли сделать, чтоб оно сразу выполняло вход в полноэкранный режим при старте TC? |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1611
|
(Separately) Posted: Sun Sep 07, 2025 13:21 Post subject: |
|
|
Orion9 wrote: | возможность масштабировать экран из настроек Windows появилась не только с Win8? |
В семерке точно есть, да и в XP кажется уже было. Другое дело, что масштабирование работало мягко говоря так себе.
A55555 wrote: | Подскажите пожалуйста ещё, как окно счетчика чучуть подвинуть вправо и вверх от центра экрана или лучше не трогать? |
Добавьте три параметра в функцию WinAlign, как в коде ниже, и попробуйте выделенные значения (это смещения от установленной позиции) менять как будет удобно.
WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"), 0, 100, -100)
A55555 wrote: | после нажатия F11 выскакивает ошибка |
Поправил переменные и умолчания настроек, вроде сейчас работает.
 Hidden text
Code: |
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
|
Но если что, код не мой, его автор присутствует на оффоруме ghisler.ch.
A55555 wrote: | Можно ли сделать, чтоб оно сразу выполняло вход в полноэкранный режим при старте TC? |
Добавьте вызов ToggleFullScreen после инициализации, вот тут:
Code: |
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
|
|
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 838
|
(Separately) Posted: Sun Sep 07, 2025 18:24 Post subject: |
|
|
A55555
Правильно сделали, что закомментировали ту строку, она была только для тестов и отладки.
A55555 wrote: | Подскажите пожалуйста ещё, как окно счетчика чучуть подвинуть вправо и вверх от центра экрана или лучше не трогать? |
Вверх - понять могу, но почему вправо? Окно и правда смотрится чуть ниже центра из-за выравнивания по рабочему столу без учета панели задач. Loopback уже предложил решение, но как альтернативный вариант окно можно приподнять функцией WinSetPos. Если позиция будет неоднократно меняться, лучше не использовать флаг WS_VISIBLE при создании окна функцией CreateWindowExW (т.е. станет 0x00C80000 вместо 0x10C80000), а делать его видимым только после всех манипуляций. Вот такой альтернативный вариант вполне приемлим:
Code: | 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 wrote: | Надеюсь кроме меня ещё кому-то пригодится. |
Сейчас заметил, что "Return" немного не туда поставил, что приводит к появлению подсказки при старте ТС, даже если прозрачность отключена и не используется. Лучше заменить на другой фрагмент:
Code: | 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 позволяет добавить кучу уникальных фич, которые сам Гислер вряд ли будет когда-то делать. Где-то полгода назад я собирал интересные скрипты, вот перезаливка. С тех пор еще поднакопилось, и когда будет время, обязательно выложу. Например, летом активно юзал подсчет времени у аудио и видео файлов. Гислера тоже просили добавить эту фичу, но когда он ее сделает, не известно. А может и вовсе не сделает. Если вдруг интересно, то вот, прикладываю сразу с подсчетом торрент-файлов:
 Hidden text Code: | 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
|
 Кнопка Code: | TOTALCMD#BAR#DATA
62013
%COMMANDER_EXE%
Подсчёт времени воспроизведения|Alt - Использовать TCMediaInfo.wdx|Ctrl - Глубина каталога = 1|Shift - Вывод информации в отладчик|CapsLock - Отключить фильтр расширений
0
-1
|
 Кнопка Code: | TOTALCMD#BAR#DATA
62014
%COMMANDER_EXE%
Подсчёт размера .torrent файлов
0
-1
|
Поменяйте только путь к библиотеке MediaInfo.dll, у меня это "COMMANDER_PATH & "\Ini\Tools\Libs\". И желательно иметь установленные плагины TCMediaInfo и TCTorrent от Loopback. Во время подсчета, если операция длительная, работает клавиша SHIFT, отображающая прогресс операции в текстовом виде. Подсчет размера торрент-файлов менее востребованная фишка, но если, например, диски под завязку, а файлы имеются, бывает необходимость прикинуть, сколько места они могут занять. Я, к примеру, сталкивался с таким.
А что касается полного экрана, то, разумеется, я видел этот код от Flasher, однако попробовать и обкатать его руки не дошли. У себя я использую TCFS2 для этих целей уже много лет, но со временем доберусь и до Autorun.
Кстати, полный экран не обязательно вызывать только горячей клавишей, можно сделать и в верхнем меню соответсвующую кнопку, тоже будет удобно. В файле меню после HELP_BREAK вставить MENUITEM ":::", em_FullScreen, где em_FullScreen - пользовательская команда для вызыва TCFS2. Возможно, вы знали о таком использовании, но так, на всякий случай написал. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1611
|
(Separately) Posted: Sun Sep 07, 2025 19:01 Post subject: |
|
|
Версия Autorun 2.2.20 beta
 История изменений
Code: | - 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 |
Как обычно, сложно сосредоточиться только на правке багов и оптимизации, когда остаются нужные и интересные задачи. В этой версии закрыл ещё три пункта, которые давно висели в todo.
Самое главное - регулярные выражения. На самом деле их стоило сделать раньше, гораздо раньше, настолько они упрощают многие задачи. К тому же при наличии готового компонента их реализация не столь сложна. Но был ряд препятствий, которые пришлось решить до начала реализации.
Еще расширение формата пункта меню для ShowPopupMenu, теперь в них можно напрямую использовать функции Autorun. И механизм внешнего взаимодействия - возможность передать данные напрямую в скрипт и получить что-то из скрипта.
В этом обновлении пришлось сделать небольшие изменения в API плагинов. Это "ломающее" изменение, но затрагивает оно только добавленную в двух прошлых версиях возможность возврата длинного текста в некоторых функциях. Чтобы не было проблем, достаточно чтобы версии плагинов Process и Runtime были актуальные, на их старых версиях с новой версией Autorun текст по прежнему будет обрезаться. Изменение затрагивает только три функции: ProcessExecGetOutput, GetSelectedItems и ClipGet. |
|
Back to top |
|
 |
yozhik

Joined: 04 May 2014 Posts: 282 Location: Электросталь
|
(Separately) Posted: Sun Sep 07, 2025 20:40 Post subject: |
|
|
Quote: | + новый плагин RegExp, функции RegExpPos, RegExpGet, RegExpReplace, объект RegExp |
Ура! _________________ Amo ergo sum |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 31
|
(Separately) Posted: Sun Sep 07, 2025 22:56 Post subject: |
|
|
Loopback wrote: | Добавьте три параметра в функцию WinAlign, как в коде ниже, и попробуйте выделенные значения (это смещения от установленной позиции) менять как будет удобно.
WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"), 0, 100, -100)
Поправил переменные и умолчания настроек, вроде сейчас работает.
Добавьте вызов ToggleFullScreen после инициализации, вот тут:
Code: |
# переход в полноэкранный режим при старте
ToggleFullScreen()
Func ToggleFullScreen(WinChange=1)
Static HasTabHeader, HasStatusBar, HasDriveList, HasKeyButtons, HasCmdLine, _
HasDriveBar, HasButtonBar, HasButtonBar2, HasMainHeader
|
|
Большое спасибо.
Все работает.
Orion9 wrote: | Вверх - понять могу, но почему вправо? Окно и правда смотрится чуть ниже центра из-за выравнивания по рабочему столу без учета панели задач. Loopback уже предложил решение, но как альтернативный вариант окно можно приподнять функцией WinSetPos. Если позиция будет неоднократно меняться, лучше не использовать флаг WS_VISIBLE при создании окна функцией CreateWindowExW (т.е. станет 0x00C80000 вместо 0x10C80000), а делать его видимым только после всех манипуляций. Вот такой альтернативный вариант вполне приемлим:
Если нужен сдвиг вправо, то за него отвечает отдельная строка. |
Спасибо. Работает, если не активировать строку сдвига вправо.
При активации строки сдвига вправо окно счетчика не появляется поверх всех окон.
Мне для тестов так удобнее чуть вправо чтоб появлялось.
Orion9 wrote: | Сейчас заметил, что "Return" немного не туда поставил, что приводит к появлению подсказки при старте ТС, даже если прозрачность отключена и не используется. Лучше заменить на другой фрагмент: |
Сменил. Но именно у меня никакой лишней подсказки не выскакивало и в предыдущем варианте. Прозрачность активирована.
Orion9 wrote: | Вообще, Autorun позволяет добавить кучу уникальных фич, которые сам Гислер вряд ли будет когда-то делать. Где-то полгода назад я собирал интересные скрипты, вот перезаливка. С тех пор еще поднакопилось, и когда будет время, обязательно выложу. Например, летом активно юзал подсчет времени у аудио и видео файлов. Гислера тоже просили добавить эту фичу, но когда он ее сделает, не известно. А может и вовсе не сделает. Если вдруг интересно, то вот, прикладываю сразу с подсчетом торрент-файлов: |
Спасибо.
TCMediaInfo и TCTorrent в моей сборке TC по умолчанию включены, путь указал для MediaInfo.dll
Я попробовал под вашей копией TC, у себя пока не смог прикрутить. У меня опыта прикручивания готовых кнопок нет, поучусь.
Last edited by A55555 on Mon Sep 08, 2025 00:39; edited 1 time in total |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 838
|
(Separately) Posted: Mon Sep 08, 2025 00:14 Post subject: |
|
|
Loopback
Топчик, как всегда )
Спасибо, что добавили копию материала по регулярным выражениям сразу в справку. Теперь придется снова заряжаться кофе и кокосовым молоком по утрам )
Давно ждал расширенного меню, чтобы избавится наконец от ненужных посредников при вызове внутренних функций. Ну и осбенно радует, что теперь можно менять стили и значки отдельных пунктов без привязки к em_командам.
Внешнее взаимодействие - шикарно просто. В общем, большое спасибо за очередную версию!
yozhik
Всё стесняюсь поинтересоваться. У вас нет планов обновить хайлайтер синтаксиса Autorun на AkelPad? Там ведь много чего добавилось.
A55555 wrote: | При активации строки сдвига вправо окно счетчика не появляется поверх всех окон. |
Я больших тестов не проводил, но вроде бы у меня работало без проблем. Даже не знаю, в чем может быть причина.
A55555 wrote: | Мне для тестов так удобнее чуть вправо чтоб появлялось. |
Понял теперь.
A55555 wrote: | Сменил. Но именно у меня никакой лишней подсказки не выскакивало и в предыдущем варианте. |
Она просто появляется у указателя мыши, я ее тоже не сразу заметил, поэтому и пропустил в первом варианте кода. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 434
|
(Separately) Posted: Mon Sep 08, 2025 06:36 Post subject: |
|
|
Loopback wrote: | - очередной раз улучшена стабильность появления сообщений об ошибках под x64 |
Проверил на текущей сборке. Вроде все нормально, окно сообщения больше не улетает за экран. Но тестовую сборку я давно грохнул. Поэтому не отвечаю за результат. А у вас не сохранилась моя тестовая сборка? Хотелось-бы не ней проверить, чтобы успокоиться. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1611
|
(Separately) Posted: Mon Sep 08, 2025 11:49 Post subject: |
|
|
AkulaBig wrote: | Проверил на текущей сборке. Вроде все нормально, окно сообщения больше не улетает за экран. |
Нет, та проблема с улетанием окна осталась не исправленной до конца, повторить я её так и не смог. Поставил проверку, которая исправляет внешние проявления, но не корень проблемы, поэтому я даже в историю ее забыл добавить. Если открыть DebugView и посмотреть, то при возникновении той ошибки будет выводиться сообщение "'Unable to get TC window rect, use desktop". Попробуйте, скорее всего и на текущей сборке проявится. Но если что - сборка осталась, при необходимости выложу.
А пункт по стабильности окна в истории изменений - это побочный эффект от поисков бага выше. Тот не исправил, зато нашел более надёжный способ блокировать автозакрытие окна. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 838
|
(Separately) Posted: Mon Sep 08, 2025 14:04 Post subject: |
|
|
Quote: | - Tweaks: более точное определение границ функциональных клавиш в ControlSetMouseAction |
Эх, хотел бы сказать, что проблема полностью ушла (и даже в какой-то момент так и показалось), но нет, все-таки вылетает иногда, зараза. Ну ладно. Это мелочи.
Quote: | - задание кодировки в виде CP:xxxx не работало |
Имеется в виду, что теперь будут работать такие записи?
Code: | buf.SetStr(pipe, 0, nSize, "CP:28591") |
Это классно.
А так, установил пока новую версию, вроде работает, но нужно, больше тестов, конечно.
A55555 wrote: | У меня опыта прикручивания готовых кнопок нет, поучусь. |
Не совсем понятно, что имеется в виду. Про копипрование кода кнопок на панель инструментов вы, наверное, знаете. А чтобы вызывать функции Autorun из кнопок ТС, для этого, как правило, регистрируется отдельный незанятый код в диапазоне 60000-100000 и указывается в соответствующей кнопке. Этот код можно использовать и в пользовательских em_командах, например, себе я сделал такую команду в файле usercmd.ini:
Code: | [em_file_fragments]
cmd=70400 |
Код 70400 вызывает функцию отображения кластеров в подсказке. Можно вызывать этот код из кнопки, но так будет не очень удобно при частом использовании. Поэтому я создал отдельную em_команду и использую ее при нажатии комбинации CTRL + F, назначенив ее в окне стандартных настроек ТС. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 434
|
(Separately) Posted: Mon Sep 08, 2025 15:09 Post subject: |
|
|
Loopback wrote: | Нет, та проблема с улетанием окна осталась не исправленной до конца, повторить я её так и не смог. |
Понятно.
Loopback wrote: | Попробуйте, скорее всего и на текущей сборке проявится. |
Не могу я эту ошибку на текущей сборке получить. У меня код изменился очень сильно.
Loopback wrote: | Но если что - сборка осталась, при необходимости выложу. |
Если вы утверждаете, что пока ту ошибку не устранили, может и нет смысла. Но на всякий случай лучше выложите куда-нибудь, если не трудно. Буду тестить каждую новую версию. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1611
|
(Separately) Posted: Mon Sep 08, 2025 20:02 Post subject: |
|
|
Orion9 wrote: | все-таки вылетает иногда, зараза |
Увы, идеально точно не получится, ширина кнопок меняется, расчётные значения ширины всё равно плюс-минус один-два пикселя будут гулять.
Orion9 wrote: | Имеется в виду, что теперь будут работать такие записи? |
Да, как и было задумано.
AkulaBig wrote: | Не могу я эту ошибку на текущей сборке получить. У меня код изменился очень сильно. |
Т.е. в DebugView ничего не пишет? Потому что улетать сейчас окно в любом случае не будет. Но если проблема опять возникнет - кидает отладочное сообщение об этом.
AkulaBig wrote: | Но на всякий случай лучше выложите куда-нибудь, если не трудно. |
Залил временно к себе, мне так удобнее чем с обменниками. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|