Orion9

|
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 страниц наговорили |
Успокойтесь, сэр. Мы только начали ) |
|