Orion9

|
Posted: Thu Sep 04, 2025 20:45 Post subject: |
|
|
A55555 wrote: | Но очень удивительно, что за столько лет |
Скорее всего фичу запрашивали, но Гислер отказался ее делать по какой-то причине. Если она вам действительно нужна, можете попробовать запросить ее на официальном форуме. А можете привлечь и сторонний софт, почему обязательно ТС.
Можно порешать и через Autorun, но у Гислера больше возможностей. Тут ведь опции в диалог нужно встраивать, чтобы все красиво было, а Autorun не может этого предложить. Работа с элементами интерфейса в Autorun требует больших усилий и по большому счету не стоит того. А управлять горячими клавишами процессом выключения ПК, ну не знаю... Не уверен, что это действительно удобно.
И всё же, если вы установили Autorun, попробуйте в качестве теста такой вариант:
 Hidden text Code: | RegisterCommand 808000 "WinShutdown"
Const PBM_SETPOS = 1026, _
PBM_SETRANGE = 1025, _
PBS_MARQUEE = 0x08, _
PBM_SETMARQUEE = 1034
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
h_WinShutdown = DllCall("CreateWindowExW", _
"dword", 0, _
"wstr", "msctls_progress32", _
"wstr", "", _
"dword", 0x10C80000, _
"int", 200, "int", 100, "int", 300, "int", 50, _
"handle", AUTORUN_TCHANDLE, _
"handle", 0, "handle", 0, "ptr", 0, _
"handle")
If h_WinShutdown = 0 Then Return 0
WinAlign(h_WinShutdown)
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
ShowHint("Монитор выключения запущен, ожидание завершения копирования...", 0, 0, 1000, 1)
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
ShowHint("Монитор выключения остановлен", 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
EndIf
#ShellExec("shutdown", "/s /t 60") # можно добавить /f для принудительного закрытия приложений
EndFunc |
Это своего рода развите кода, предложенного Loopback.
Ctrl+Alt+O - включает и выключает ожидание завершения процесса копирования, чтобы после него выключить ПК. Если включено, то после завершения копирования появится дополнительное окно отсчета 100 секунд до выключения ПК с возможностью отмены. Самого выключения пока не произойдет, т.к. я его отключил (закомментировал строку) во избежания проблем на время тестов. Если всё устроит, можно будет включить назад.
Кстати, окно отсчета до завершения можно вызвать отдельной кнопкой для визуального теста:
Code: | TOTALCMD#BAR#DATA
808000
%COMMANDER_EXE%
808000
-1
|
Я бы поучавствовал глубже в разработке и тестах при прочих обстоятельствах, но сейчас у меня действительно много срочных дел, т.ч. если Loopback продолжит развивать эту тему, то расчитывать вам можно будет, наверное, только на него. |
|