Orion9

|
Posted: Tue Feb 10, 2026 13:54 Post subject: |
|
|
Прошелся тут по последним страницам. Удивительно, ссылки на 11,000 сохранилась, а ссылка на 13К не доступна. Непорядок творится в королевстве. Перезаливка.
https://www.upload.ee/files/19062762/TC.11.56.7z.html
 Warning Сайт находится в 16-20 Кб блоке. С территории России без средств обхода скачать архив не получится. Адрес площадки пока не меняю, вдруг блокировку еще снимут.
Обновил модуль Icons.aucfg.
 Hidden text | Code: | Pragma IncludeOnce
# 64000-65000
Global TrayShow = 0, TrayLog = List()
Global Tray1001 = 0, Tray1002 = 0, Tray1003 = 0, Tray1010 = 0
Global gNotifyIcon = COMMANDER_EXE
#Global gNotifyIcon = COMMANDER_PATH & "\Ini\Newsbar\notify-yes.ico"
# регистрация уникальных кодов
Global Code1003 = DllCall("RegisterWindowMessageW", "wstr", "TrayNotify1003", "uint")
Global Code1010 = DllCall("RegisterWindowMessageW", "wstr", "TrayNotify1010", "uint")
# коды кнопок
RegisterCommand 64000 "ToggleTrayIcon"
RegisterCommand 64001 "ChangeTrayIcon"
RegisterCommand 64002 "NotifyInfo"
RegisterCommand 64003 "RotateIcon"
# функции обратного вызова
SetMessageAction /P 99999 "AutorunTrayAction"
SetMessageAction /P %"Code1003" "MinTrayAction"
SetMessageAction /P %"Code1010" "TrayNotifyInfo"
# сворачивание в трей
ControlSetMouseAction /K:C /L /H:8 0 "MinimizeToTray"
# иконки окна уведомлений
Const NIIF_NONE = 0x00000000, _
NIIF_INFO = 0x00000001, _
NIIF_WARNING = 0x00000002, _
NIIF_ERROR = 0x00000003, _
NIIF_USER = 0x00000004
# без звука
Const NIIF_NOSOUND = 0x00000010
# большая иконка
Const NIIF_LARGE_ICON = 0x00000020
# сообщения окна уведомлений
Const NIN_BALLOONSHOW = 0x402, _
NIN_BALLOONHIDE = 0x403, _
NIN_BALLOONTIMEOUT = 0x404, _
NIN_BALLOONUSERCLICK = 0x405, _
NIN_POPUPOPEN = 0x406, _
NIN_POPUPCLOSE = 0x407
# флаги структуры
Const NIF_MESSAGE = 0x00000001, _
NIF_ICON = 0x00000002, _
NIF_TIP = 0x00000004, _
NIF_STATE = 0x00000008, _
NIF_INFO = 0x00000010
# системные сообщения
Const WM_MOUSEMOVE = 0x0200, _
WM_LBUTTONDOWN = 0x0201, _
WM_LBUTTONUP = 0x0202, _
WM_LBUTTONDBLCLK = 0x0203, _
WM_RBUTTONDOWN = 0x0204, _
WM_RBUTTONUP = 0x0205, _
WM_RBUTTONDBLCLK = 0x0206, _
WM_MBUTTONDOWN = 0x0207, _
WM_MBUTTONUP = 0x0208, _
WM_MBUTTONDBLCLK = 0x0209
# старт
TrayIcon()
# главная иконка
Func TrayIcon()
Local ico, idx = 0
# чтение конфигурации
IniRead TrayShow %AUTORUN_INI% "TrayIcon" "Show" 1
If Not TrayShow Then
Return
EndIf
IniRead ico %AUTORUN_INI% "TrayIcon" "Icon"
IniRead idx %AUTORUN_INI% "TrayIcon" "Index" 0
# раскрытие переменной окружения
ico = Set(ico)
# откат к умолчаниям
If ico = "" Or Not FileExist(ico) Then
idx = 0
ico = COMMANDER_EXE
EndIf
Local sHint = "Autorun " & FileGetVersion(AUTORUN_PATH & "\Autorun.wdx", "FileVersion")
If auX64 Then sHint &= " x64"
# дескриптор иконки
Local hIco = DllCall("shell32\ExtractIconW", _
"ptr", AUTORUN_TCHANDLE, _
"wstr", ico, "uint", idx, "ptr")
# установка в трей с идентификатором 1001
If NotifyIcon("add", 1001, 99999, hIco, sHint) Then Tray1001 = 1
If hIco > 0 Then DllCall("DestroyIcon", "ptr", hIco)
EndFunc
# главная иконка Autorun
# функция обратного вызова
Func AutorunTrayAction(hWnd, uMsg, wParam, lParam)
Local bCtrl = IsPressed(0x11)
Switch lParam
# движение над иконкой
Case WM_MOUSEMOVE
If LAST_HINT_WINDOW = 0 Then
If bCtrl Then ShowHint(GetState("threads"), "", "", 2000, 1)
EndIf
# левый клик
Case WM_LBUTTONDOWN
If bCtrl Then
ClipPut(GetState("threads"))
ShowHint(GetState("threads"))
#ShowDarkHint(GetState("threads"))
Return
EndIf
AutorunMenu(0)
# правый клик
Case WM_RBUTTONDOWN
If bCtrl Then
ShowDarkHint(GetState("libs"))
Else
ShowSetEnviroments()
EndIf
# клик по сообщению
Case NIN_BALLOONUSERCLICK
MsgBox("Baloon click")
#WinSetState(23)
# клик "закрыть сообщение"
Case NIN_BALLOONTIMEOUT
MsgBox("Time-out")
EndSwitch
EndFunc
# иконка уведомлений
Func TrayNotifyInfo(hWnd, uMsg, wParam, lParam)
Switch lParam
Case WM_LBUTTONDOWN
ShowPopupMenu /D /F "TrayNotifyInfoMenu"
Case WM_RBUTTONDOWN
#NotifyIcon("delete", 1010)
Case NIN_BALLOONUSERCLICK
Case NIN_BALLOONTIMEOUT
EndSwitch
EndFunc
# меню уведомлений
Func TrayNotifyInfoMenu()
Local txt, nIco, sIco, sTime, sInfo, sType, sFunc, i = 0, j = 0
For i = TrayLog.Count - 1 To 0 Step -1
nIco = -1
sIco = "-1"
sTime = StrPart(TrayLog[i], Chr(0), 1)
sInfo = StrPart(TrayLog[i], Chr(0), 2)
sType = StrPart(TrayLog[i], Chr(0), 4)
If BitAND(sType, 3) = 1 Then
nIco = 76
ElseIf BitAND(sType, 3) = 2 Then
nIco = 79
ElseIf BitAND(sType, 3) = 3 Then
nIco = 93
EndIf
If nIco <> -1 Then sIco = "imageres.dll," & nIco
sFunc = "TrayNotifyItem " & i & " " & nIco
txt &= 'MENUITEM "' & sTime & " " & sInfo & '", em_aucmd ' & sIco & " " & sFunc & auCRLF
j += 1
If j = 30 Then Break
Next
If TrayLog.Count = 0 Then txt &= 'MENUITEM "<Пусто>", em_aucmd' & auCRLF
txt &= 'MENUITEM SEPARATOR' & auCRLF
txt &= 'MENUITEM "Копировать", em_aucmd -1 TrayNotifyCopy' & auCRLF
txt &= 'MENUITEM "Скрыть иконку", em_aucmd -1 NotifyIcon "delete" 1010' & auCRLF
Return txt
EndFunc
Func TrayNotifyItem(nItem, nIco)
Local nFlag
Local sInfo = StrPart(TrayLog[nItem], Chr(0), 2)
Local sText = StrPart(TrayLog[nItem], Chr(0), 3)
Switch nIco
Case 76
nFlag = 64
Case 79
nFlag = 48
Case 93
nFlag = 16
Else
nFlag = ''
EndSwitch
MsgBox(sText, sInfo, nFlag)
EndFunc
Func TrayNotifyCopy()
Local txt = TrayLog.Text
txt = StrReplace(txt, Chr(0), ";")
ClipPut(txt)
ShowTransHint("Скопировано в буфер")
EndFunc
# переключение иконки
Func ToggleTrayIcon(lParam)
If Tray1001 > 0 Then
IniWrite %AUTORUN_INI% "TrayIcon" "Show" 0
If NotifyIcon("delete", 1001) Then Tray1001 = 0
Else
IniWrite %AUTORUN_INI% "TrayIcon" "Show" 1
TrayIcon()
EndIf
If Tray1001 > 0 Then
ShowTransHint("Иконка включена")
Else
ShowTransHint("Иконка отключена")
EndIf
EndFunc
# иконка свернутого окна
Func MinTrayAction(hWnd, uMsg, wParam, lParam)
If lParam = WM_LBUTTONDOWN Then
If NotifyIcon("delete", 1003) Then Tray1003 = 0
WinSetState(5)
WinSetState(23)
ElseIf lParam = WM_RBUTTONDOWN Then
EndIf
EndFunc
# сворачивание
Func MinimizeToTray()
Local sHint = "Click to restore Total Commander"
Local hIcon = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0)
If hIcon = 0 Then
MsgBox("Не удалось получить дескриптор иконки", "Autorun", 48)
Return
EndIf
If NotifyIcon("add", 1003, Code1003, hIcon, sHint) Then Tray1003 = 1
WinSetState(0)
EndFunc
# тестовая функция
Func ChangeTrayIcon(lParam)
Static sDLL = GetKnownFolderPath("System") & "\shell32.dll", i = 10
If Tray1001 = 0 Then
ShowHint("Иконка отключена")
Return
EndIf
i += 1
Local hIco
hIco = DllCall("shell32\ExtractIconW", _
"ptr", AUTORUN_TCHANDLE, _
"wstr", sDLL, "uint", i, "ptr")
If IsPressed(0x11) Then
If NotifyIcon("add", 1002, 99999, hIco, "Autorun #2", "Second icon added", "Autorun", NIIF_INFO) Then
Tray1002 = 1
EndIf
Else
If IsPressed(0x12) Then hIco = 0
NotifyIcon("set", 1001, 99999, hIco, "", "Icon changed to shell32.dll, " & i, "", NIIF_WARNING)
Sleep(2000)
NotifyIcon("set", 1001,, hIco,, "Icon changed to shell32.dll, " & i,, NIIF_ERROR)
EndIf
If hIco > 0 Then DllCall("DestroyIcon", "ptr", hIco, "bool")
EndFunc
# тест уведомлений
Func NotifyInfo(lParam)
Local bCtrl = IsPressed(0x11)
Static i = 0
i += 1
If i > 3 Then i = 1
If bCtrl Then i = 1
If i = 1 Then
NotifyInfoMessage("Test message", "Test 1", NIIF_INFO)
If Not bCtrl Then Return
Sleep(2000)
EndIf
If bCtrl Or i = 2 Then
txt = "Pragma Include %COMMANDER_PATH%\Ini\Scripts\Test.aucfg"
NotifyInfoMessage(txt, "Test 2", NIIF_WARNING + NIIF_NOSOUND)
If Not bCtrl Then Return
Sleep(2000)
EndIf
If bCtrl Or i = 3 Then
txt = "Test message line 1" & auCRLF & "Test message line 2"
NotifyInfoMessage(txt, "Test 3", NIIF_ERROR)
EndIf
EndFunc
# проверка существования иконки
# функция имеет проблемы на Win10
Func IsIconOnTray(uId)
Local rc = Buffer(16) # RECT
rc.Zero()
Local id = Buffer(auX64 ? 40 : 28)
id.Zero()
If auX64 Then
id.SetNum(0, "dword", id.size)
id.SetNum(8, "hwnd", AUTORUN_TCHANDLE)
id.SetNum(16, "uint", uId)
Else
id.SetNum(0, "dword", id.size, _
"hwnd", AUTORUN_TCHANDLE, _
"uint", uId)
EndIf
Local hr = DllCall("Shell32.dll\Shell_NotifyIconGetRect", "ptr", id.ptr, "ptr", rc.ptr)
Free(id, rc)
Return hr = 0 ? true : false
EndFunc
#{
Вызов системных уведомлений:
InfoText - текст уведомления (255 символов)
InfoTitle - текст заголовка уведомления (63 символов)
InfoType - флаги NIIF_* меняющие вид и поведение окна уведомлений
Функция использует идентификатор "1010"
#}
Func NotifyInfoMessage(InfoText, InfoTitle = "Autorun", InfoType = 0)
Local Offset = auX64 ? 40 : 24, sIcon
Static buf = Buffer(auPtrSize = 4 ? 956 : 976)
Static nFlags = BitOR(NIF_MESSAGE, NIF_ICON, NIF_INFO, NIF_TIP)
If FileExist(gNotifyIcon) Then
sIcon = gNotifyIcon
Else
sIcon = COMMANDER_EXE
EndIf
Static hIco = DllCall("shell32\ExtractIconW", _
"ptr", AUTORUN_TCHANDLE, _
"wstr", sIcon, "uint", 0, "ptr")
NotifyIcon("delete", 1010)
buf.Zero()
If auX64 Then
buf.SetNum(0, "dword", buf.size)
buf.SetNum(8, "hwnd", AUTORUN_TCHANDLE)
buf.SetNum(16, "uint", 1010, _
"uint", nFlags, _
"uint", Code1010)
buf.SetNum(32, "ptr", hIco)
buf.SetNum(296, "dword", 1, _
"dword", 1)
Else
buf.SetNum(0, "dword", buf.size, _
"hwnd", AUTORUN_TCHANDLE, _
"uint", 1010, _
"uint", nFlags, _
"uint", Code1010, _
"ptr", hIco)
buf.SetNum(280, "dword", 1, _
"dword", 1)
EndIf
buf.SetStr("Notify Messages" & Chr(0), Offset)
buf.SetStr(StrLeft(InfoText, 255) & Chr(0), Offset + 264) # 256 + 4 + 4
Offset += 264
If InfoTitle <> "" Then
buf.SetStr(StrLeft(InfoTitle, 63) & Chr(0), Offset + 516) # 512 + 4
EndIf
Offset += 516
If InfoType > 0 Then
buf.SetNum(Offset + 128, "dword", InfoType) # 128
EndIf
TrayLog.Add(Time() & Chr(0) & InfoTitle & Chr(0) & InfoText & Chr(0) & InfoType)
Tray1010 = 1
Return DllCall("Shell32.dll\Shell_NotifyIconW", "uint", 0, "ptr", buf.ptr)
EndFunc
#{
Добавление иконки в трей:
sAction - тип действия ("add", "set", "delete")
uID - внутренний уникальный идентификатор иконки
nCallback - код зарегистрированного сообщения для функции обратного вызова
hIcon - дескриптор иконки (только для "add")
sTip - текст подсказки в трее
sText - текст уведомления (только для "add" и "set")
sTitle - текст заголовка уведомления
nType - флаги NIIF_* (изменение вида и поведения окна уведомлений)
https://learn.microsoft.com/en-us/windows/win32/api/shellapi/ns-shellapi-notifyicondataw
#}
Func NotifyIcon(sAction, uID, nCallback = 0, hIcon = 0, sTip = "", sText = "", sTitle = "", nType = 0)
Local nAction, nFlags
Static TIP_MAXCHAR = 127, INFO_MAXCHAR = 255, TITLE_MAXCHAR = 63
Static buf = Buffer(auPtrSize = 4 ? 956 : 976)
buf.Zero()
nFlags = BitOR( hIcon = 0 ? 0 : NIF_ICON, _
nCallback = 0 ? 0 : NIF_MESSAGE, _
StrLen(sTip) = 0 ? 0 : NIF_TIP, _
StrLen(sText) = 0 ? 0 : NIF_INFO )
Switch sAction
Case "add"
nAction = 0
Case "set"
nAction = 1
Case "delete"
nAction = 2
Else
Return
EndSwitch
If auX64 Then
buf.SetNum(0, "dword", buf.size)
buf.SetNum(8, "hwnd", AUTORUN_TCHANDLE)
buf.SetNum(16, "uint", uID, _
"uint", nFlags, _
"uint", nCallback)
buf.SetNum(32, "ptr", hIcon)
Else
buf.SetNum(0, "dword", buf.size, _
"hwnd", AUTORUN_TCHANDLE, _
"uint", uID, _
"uint", nFlags, _
"uint", nCallback, _
"ptr", hIcon)
EndIf
Local nOffset = auX64 ? 40 : 24 # PtrSize*2 + 4*4 + padding for X64
If sTip <> 0 Then
buf.SetStr(StrLeft(sTip, TIP_MAXCHAR) & Chr(0), nOffset)
EndIf
If sText <> 0 Then
nOffset += 264
buf.SetStr(StrLeft(sText, INFO_MAXCHAR) & Chr(0), nOffset) # 256 + 4 + 4
If sTitle <> 0 Then
buf.SetStr(StrLeft(sTitle, TITLE_MAXCHAR) & Chr(0), nOffset + 516) # 512 + 4
EndIf
If nType > 0 Then
buf.SetNum(nOffset + 644, "dword", nType) # 128
EndIf
EndIf
Return DllCall("Shell32.dll\Shell_NotifyIconW", "uint", nAction, "ptr", buf.ptr, "bool")
EndFunc
Global ROTATE_THREAD = 0
Func RotateIcon()
If ROTATE_THREAD > 0 Then
ROTATE_THREAD = 0
Return
EndIf
RunThread("ThreadRotateIcon", IsPressed(0x11))
EndFunc
Func ThreadRotateIcon(FileIcons)
ROTATE_THREAD = 1
Local hIcon = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0)
While ROTATE_THREAD > 0
Sleep(150)
If FileIcons Then
IconRotateDraw()
Else
RotateDeviceContext()
EndIf
Wend
SendMessage(AUTORUN_TCHANDLE, 0x80, 0, hIcon)
WinRedraw(2)
EndFunc
Func IconRotateDraw()
Static nIco = 0
nIco += 1
If nIco > 4 Then nIco = 1
Local sFile = COMMANDER_PATH & "\Icons\TC\" & nIco & ".ico"
Local hIco = DllCall("shell32\ExtractIconW", _
"ptr", AUTORUN_TCHANDLE, _
"wstr", sFile, _
"uint", 0, _
"ptr")
Local hWnd = WinFind(AUTORUN_TCHANDLE, _
(AUTORUN_TCARCH = 32 ? "TMyPanel" : "Window"), _
(AUTORUN_TCARCH = 32 ? 6 : 10))
# Local hWnd = RequestInfo(15)
# hDC = DllCall("GetDC", "ptr", hWnd, "ptr")
Local hDC = DllCall("GetWindowDC", "ptr", hWnd, "ptr")
Local x, y, w, h
WinGetPos("x", "y", "w", "h", hWnd)
DllCall("DrawIconEx", _
"ptr", hDC, _
"int", w - 20, _
"int", 1, _
"ptr", hIco, _
"int", 16, _
"int", 16, _
"uint", 0, _
"ptr", 0, _
"uint", 0x0003)
SendMessage(AUTORUN_TCHANDLE, 0x80, 0, hIco)
SendMessage(AUTORUN_TCHANDLE, 0x80, 1, hIco)
DllCall("ReleaseDC", "ptr", AUTORUN_TCHANDLE, "ptr", hDC)
DllCall("DestroyIcon", "ptr", hIco)
EndFunc
Func RotateDeviceContext()
Static c = 0
c += 1
If c > 4 Then c = 1
Local x, y, w, h
Local hIco = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0)
Local hWnd = WinFind(AUTORUN_TCHANDLE, _
(AUTORUN_TCARCH = 32 ? "TMyPanel" : "Window"), _
(AUTORUN_TCARCH = 32 ? 6 : 10))
Local DC = DllCall("GetDC", "int", 0)
Local nDPI = DllCall("GetDeviceCaps", "handle", DC, "int", 88)
Local nScale = DllCall("MulDiv", "int", 100, "int", nDPI, "int", 96)
Local nSize = Round(16*nScale/100,0)
# Local hWnd = RequestInfo(15)
Local hdcWndDC = DllCall("GetWindowDC", "ptr", hWnd, "ptr")
Local hdcMemDC = DllCall("CreateCompatibleDC", "ptr", hdcWndDC, "ptr")
Local hdcBltDC = DllCall("CreateCompatibleDC", "ptr", hdcWndDC, "ptr")
Local hbmDB1 = DllCall("CreateCompatibleBitmap", "ptr", hdcWndDC, "int", nSize, "int", nSize,"ptr")
Local hbmDB2 = DllCall("CreateCompatibleBitmap", "ptr", hdcWndDC, "int", nSize, "int", nSize,"ptr")
DllCall("SelectObject", "ptr", hdcMemDC, "ptr", hbmDB1, "ptr")
DllCall("SelectObject", "ptr", hdcBltDC, "ptr", hbmDB2, "ptr")
DllCall("DrawIconEx", _
"ptr", hdcMemDC, _
"int", 1, _
"int", 1, _
"ptr", hIco, _
"int", nSize, _
"int", nSize, _
"uint", 0, _
"ptr", 0, _
"uint", 0x0003)
Local pt = Buffer(24)
pt.Zero()
If c = 1 Then
pt.SetNum(0, "int", nSize, "int", 0, _
"int", 0, "int", 0, _
"int", nSize, "int", nSize)
ElseIf c = 2 Then
pt.SetNum(0, "int", nSize, "int", nSize, _
"int", nSize, "int", 0, _
"int", 0, "int", nSize)
ElseIf c = 3 Then
pt.SetNum(0, "int", 0, "int", nSize, _
"int", nSize, "int", nSize, _
"int", 0, "int", 0)
ElseIf c = 4 Then
pt.SetNum(0, "int", 0, "int", 0, _
"int", 0, "int", nSize, _
"int", nSize, "int", 0)
EndIf
DllCall("PlgBlt", _
"ptr", hdcBltDC, _
"ptr", pt.Ptr, _
"ptr", hdcMemDC, _
"int", 0, _
"int", 0, _
"int", nSize, _
"int", nSize, _
"ptr", 0, _
"int", 0, "int", 0)
WinGetPos("x", "y", "w", "h", hWnd)
DllCall("BitBlt", _
"ptr", hdcWndDC, _
"int", w - 20, _
"int", 2, _
"int", nSize, _
"int", nSize, _
"ptr", hdcBltDC, _
"int", 1, _
"int", 1, _
"dword", 13369376)
DllCall("DeleteObject", "ptr", hbmDB1)
DllCall("DeleteObject", "ptr", hbmDB2)
DllCall("DeleteObject", "ptr", hdcMemDC)
DllCall("DeleteObject", "ptr", hdcBltDC)
DllCall("ReleaseDC", "ptr", AUTORUN_TCHANDLE, "ptr", hdcWndDC)
EndFunc |
В модуле есть две универсальные функции для показа системных уведомлений и создания иконок в трее: NotifyInfoMessage и NotifyIcon. Коды кнопок 64000-64002 тестирую функционал. Созданные идентификаторы иконок нужно добавить в секцию финализации, чтобы при выхода из ТС они не оставались висеть в трее.
 Pragma AutorunFinalizeSection | Code: | # удаление иконок
If Tray1001 > 0 Then NotifyIcon("delete", 1001)
If Tray1002 > 0 Then NotifyIcon("delete", 1002)
If Tray1003 > 0 Then NotifyIcon("delete", 1003)
If Tray1010 > 0 Then NotifyIcon("delete", 1010) |
Модуль можно накатить на тот, что в сборке, для удобного и быстрого теста. |
|