Orion9

|
Posted: Wed Apr 29, 2026 19:49 Post subject: |
|
|
| FallenAngel wrote: | | Т.е. нажал - переключились три параметра, нажал еще раз - вернулось как было. |
К сожалению, это не так просто сделать, как может показаться. Все эти параметры привязаны к разрешению и DPI — потребуются сложные алгоритмы для чтения и записи ключей в файл конфигурации. Вряд ли оно того стоит.
 Iconsize32 [%Screen_Resolution%]
Iconsize32=16
Wincmd.ini Version: 3.00
Определяет размер значков (в пикселях) для файловых панелей, а также для выпадающего списка в цепочках навигации и для списка в диалоге "Соединение с FTP-сервером".
По умолчанию: 16 (в списке на странице настроек "Значки" отображается как 16x16).
ПРИМЕЧАНИЯ:
Изменение этого ключа приводит к автоматической коррекции высоты строк в соответствующем списке. Опция остаётся доступной, даже если значки в файловых панелях отключены (Showicons=0), в этом случае она просто определяет высоту строк в файловом списке. Аналогичным образом ключ влияет на высоту строк в не содержащем значки окне "Дерево каталогов" (ALT+F10).
Минимальный размер места, отведённого для значков в файловых панелях, может зависеть от дополнительных отступов, задаваемых ключами MinLineHeight и MinIconWidth.
В режиме эскизов для тех файлов, у которых вместо эскизов отображаются значки, их размер регулируется отдельным ключом ThumbIconSize.
В 16-битных версиях TC (по 6.58 включительно) использовался аналогичный по назначению ключ Iconsize, где размер значка указывался в пунктах (в оригинальной английской справке он упоминается и сейчас, но не включён в русскую справку и в базу данных Configuration Editor по причине полной бесполезности в любых 32- и 64-битных версиях TC).
Для работы на нескольких мониторах с различным масштабированием дополнительно используются ключи вида Iconsize32_<DPI> (см. описание Iconsize32_96) и Iconsize32_dpi.
Пояснения по именам секций, зависящих от экранного разрешения, см. в описании ключа ExtraDriveWidth ("Интерфейс программы" — "Основное окно" — "Стиль отображения").
Значение ключа можно изменить на странице настроек "Значки", выбрав в выпадающем списке один из стандартных вариантов (16x16, 24x24, 32x32, 48x48 или 64x64). Другие размеры можно ввести вручную, хотя это и не рекомендуется (с произвольным масштабированием значков возможны проблемы). Достаточно указать в поле "Размер значка" одно число, сохранённое значение отображается в виде NxN, но в выпадающий список не добавляется.
[%Screen_Resolution%]
Iconsize32_96=16
Wincmd.ini Version: 9.21
Дополняет ключ Iconsize32, определяя размер значков (в пикселях) для файловых панелей, а также для выпадающего списка в цепочках навигации и для списка в диалоге "Соединение с FTP-сервером" при работе на нескольких мониторах с разным масштабированием (DPI).
По умолчанию: 16 (в списке на странице настроек "Значки" отображается как 16x16).
ПРИМЕЧАНИЯ:
Этот ключ дополняет работу основного ключа Iconsize32 (см. его описание), когда операционная система при работе с несколькими мониторами позволяет указывать для них разное значение DPI (эта возможность впервые заявлена в Windows 8.1, а должным образом начала работать в Windows 10).
Размер значков, изменённый на первичном мониторе, записывается как значение основного ключа Iconsize32 в секцию, соответствующую текущему разрешению экрана. Если же вывести окно TC на второй экран с другим значением DPI и изменить там размер значков через диалог настроек, то в секции с разрешением для первичного монитора будет автоматически создан также ключ вида Iconsize32_<DPI>, содержащий в имени значение DPI (число точек на дюйм) для вторичного монитора. Это позволит затем при переключении между мониторами автоматически выбирать размер значка, сопоставленный данному значению DPI.
Ключи вида Iconsize32_<DPI> с указанием DPI в именах имеют приоритет перед ключом Iconsize32_dpi с указанием DPI в значении.
Используемое в файле данных Configuration Editor имя Iconsize32_96 является демонстрационным. Если это необходимо, можно добавить один или несколько аналогичных ключей (например, Iconsize32_120), открыв этот файл данных, например, в Блокноте и приведя имя и описание нового ключа в соответствие с системным значением DPI для вторичного монитора. Вы также можете вызвать в Configuration Editor встроенную функцию добавления ключа комбинацией SHIFT+F4 или через меню ("Правка" —> "Файл данных" —> "Добавить ключ"). Однако предпочтительнее изменять размер значков через основной диалог настроек TC.
Пояснения по именам секций, зависящих от экранного разрешения, см. в описании ключа ExtraDriveWidth ("Интерфейс программы" — "Основное окно" — "Стиль отображения").
Значение ключа можно изменять на странице настроек "Значки", но опосредованно, через изменение других настроек (см. выше).
[%Screen_Resolution%]
Iconsize32_dpi=96
Wincmd.ini Version: 10.50
Сохраняет значение экранного масштабирования (DPI, в точках на дюйм), установленное при последнем сохранении значения ключа Iconsize32 для данного экранного разрешения.
По умолчанию значение не указано (условно 96).
ПРИМЕЧАНИЯ:
Ключ используется для динамического масштабирования значков при переключении между двумя экранами с различным DPI (подробности см. в описании ключа Iconsize32_96). Он создаётся и изменяется автоматически, вмешательства пользователя его работа обычно не требует. Ключи с явным указанием DPI в именах имеют приоритет перед Iconsize32_dpi, который важен только в случае их отсутствия.
Пояснения по именам секций, зависящих от экранного разрешения, см. в описании ключа ExtraDriveWidth ("Интерфейс программы" — "Основное окно" — "Стиль отображения").
Значение ключа можно изменять на странице настроек "Значки", но опосредованно, через изменение других настроек (см. выше).
 Buttonheight [Buttonbar]
Buttonheight=29
Wincmd.ini Version: 1.30
Определяет размер кнопок в главной панели инструментов (в пикселях), влияющий также на высоту строк панели.
При правке значения вручную надо указывать его на 5 пикселей больше того, которое отображается в окне настройки Total Commander!
По умолчанию используется значение 29, что соответствует размеру 24 в окне настройки.
ПРИМЕЧАНИЯ:
При использовании ключа SmallIcons со значением 1 размер значков на кнопках главной панели инструментов будет практически равен размеру самих кнопок, в противном случае (при SmallIcons=0, как по умолчанию) размер значков на этих кнопках определяется ключом SmallIconSize.
Оверлейные значки в правом нижнем углу некоторых кнопок (со стрелкой вниз — для открытия связанной панели в виде выпадающего меню, с вертикальными полосками — при приостановке синхронной навигации) отрисовываются увеличенными для кнопок с отображаемым в диалоге настройки размером 25 и более, а начиная с размера кнопок 40 увеличиваются дополнительно.
ВНИМАНИЕ! Эта и последующие диалоговые опции — общие для главной панели инструментов и всех её дочерних панелей. Содержимое конкретных панелей описывается специальным набором ключей в соответствующих BAR-файлах. Вертикальная панель инструментов, расположенная между файловыми панелями, настраивается одноимёнными ключами, содержащимися в секции [ButtonbarVertical].
Значение ключа можно изменить в диалоге "Настройка панели инструментов" для главной панели.
[Buttonbar]
Buttonheight96=29
Wincmd.ini Version: 9.20
Определяет, как и Buttonheight, размер кнопок в главной панели инструментов (и, соответственно, высоту её строк), но предназначен для экрана с указанным в имени ключа DPI (в данном случае — 96 точек на дюйм).
При правке значения вручную надо указывать его на 5 пикселей больше того, которое отображается в окне настройки Total Commander!
По умолчанию используется значение 29, что соответствует размеру 24 в окне настройки.
ПРИМЕЧАНИЯ:
Ключ введён для улучшения работы с панелью инструментов на нескольких мониторах с различным масштабированием. Например, при текущем системном значении DPI 96 любое первичное изменение настроек главной панели сохраняет пару ключей Buttonheight и Buttonheight96 с одинаковыми значениями. Кроме того, сохраняются ключи SmallIconSize и SmallIconSize96, а также ключ DefaultDpi=96, фиксирующий текущее значение DPI. При переключении на монитор с другим DPI прежние размеры в INI-файле не перезаписываются, но в диалоге отображаются уже в автоматически преобразованном виде. Если затем изменить в диалоге значения Buttonheight и/или SmallIconSize, с этими значениями будут автоматически созданы новые дополнительные ключи. Например, при DPI 120 появятся ключи Buttonheight120, SmallIconSize120, ключ DefaultDpi примет значение 120, а ключи Buttonheight96 и SmallIconSize96 останутся неизменными.
При изменении системного DPI автоматически создаются также по мере необходимости файлы с кэшем значков, дополняющие такие файлы, как default.br2. Соответствующее значение DPI завершает их расширения вместо цифры 2: например, default.br96, default.br120 и т.д.
Используемое в файле данных Configuration Editor имя Buttonheight96 является демонстрационным. Для системных значений DPI, отличных от 96, можно добавить один или несколько аналогичных ключей (например, Buttonheight120), открыв этот файл данных, например, в Блокноте и приведя имя и описание нового ключа в соответствие с системным значением DPI. Вы также можете вызвать в Configuration Editor встроенную функцию добавления ключа комбинацией SHIFT+F4 или через меню ("Правка" —> "Файл данных" —> "Добавить ключ"). Однако предпочтительнее изменять размер кнопок/значков через диалог "Настройка панели инструментов" в TC.
Значение ключа можно изменить в диалоге "Настройка панели инструментов" для главной панели, но опосредованно, через изменение других настроек (см. выше).
 SmallIconSize [Buttonbar]
SmallIconSize=16
Wincmd.ini Version: 7.00
Определяет размер значков в главной панели инструментов (в пикселях) для случая, когда он не совпадает с размером кнопок (SmallIcons=1).
По умолчанию: 16.
ПРИМЕЧАНИЕ: По умолчанию значение ключа используется и для значков дочерней панели в виде выпадающего меню (см. ключ PopupIconSize). Размер "маленького" значка может на величину до 5 пикселей превышать размер кнопки, указанный в диалоге настройки (поскольку эта цифра прибавляются при записи ключа Buttonheight к его значению).
Значение ключа можно изменить в диалоге "Настройка панели инструментов" для главной панели, однако оно сохраняется только при SmallIcons=1.
[Buttonbar]
SmallIconSize96=16
Wincmd.ini Version: 9.20
Определяет, как и SmallIconSize, размер значков в главной панели инструментов для случая, когда он не совпадает с размером кнопок (SmallIcons=1), но предназначен для экрана с указанным в имени ключа DPI (в данном случае — 96 точек на дюйм).
По умолчанию: 16.
ПРИМЕЧАНИЯ:
Ключ введён для улучшения работы с панелью инструментов на нескольких мониторах с различным масштабированием. Основные принципы зависимости этих опций от текущего значения DPI изложены в описании ключа Buttonheight96.
По умолчанию значение ключа используется и для значков дочерней панели в виде выпадающего меню (см. ключ PopupIconSize). Размер "маленького" значка может на величину до 5 пикселей превышать размер кнопки, указанный в диалоге настройки (поскольку эта цифра прибавляются при записи ключа Buttonheight к его значению).
Значение ключа можно изменить в диалоге "Настройка панели инструментов" для главной панели, но опосредованно, через изменение других настроек (см. описание Buttonheight96).
[Buttonbar]
DefaultDpi=96
Wincmd.ini Version: 9.20
Определяет системное значение DPI, учитываемое в настройках кнопок главной панели инструментов при сохранении значений Buttonheight и SmallIconSize для текущего экрана. Используется для масштабирования значков.
По умолчанию: условно 96 (для DPI 96).
ПРИМЕЧАНИЕ: Ключ введён для улучшения работы с панелью инструментов на нескольких мониторах с различным масштабированием. Основные принципы зависимости этих опций от текущего значения DPI изложены в описании ключа Buttonheight96.
Значение ключа непосредственно в диалоговом режиме не изменяется, но устанавливается и корректируется автоматически при сохранении упомянутых выше опций.
FallenAngel
На случай, если Loopback не вернется... Спросил я тут у интеллехта, как повесить хук, и он сразу дал рабочее решение.
 ahk | Code: | #Requires AutoHotkey v2.0
Persistent ; Скрипт должен продолжать работу для получения сообщений
; Константы WinAPI
WH_MOUSE_LL := 14
WM_LBUTTONDOWN := 0x0201
HC_ACTION := 0
; 1. Создаем Callback. "Fast" рекомендуется для хуков ввода.
mouseCallback := CallbackCreate(LowLevelMouseProc, "Fast", 3)
; 2. Устанавливаем хук
hHook := DllCall("SetWindowsHookEx", "Int", WH_MOUSE_LL, "Ptr", mouseCallback, "Ptr", DllCall("GetModuleHandle", "Ptr", 0, "Ptr"), "UInt", 0, "Ptr")
if !hHook {
MsgBox "Не удалось установить хук!"
ExitApp
}
; Удаляем хук при закрытии скрипта
OnExit((*) => DllCall("UnhookWindowsHookEx", "Ptr", hHook))
; --- Сама функция перехвата ---
LowLevelMouseProc(nCode, wParam, lParam)
{
if nCode = HC_ACTION {
; Пример: ловим нажатие левой кнопки мыши
if wParam = WM_LBUTTONDOWN {
; Извлекаем координаты из структуры MSLLHOOKSTRUCT
x := NumGet(lParam, 0, "Int")
y := NumGet(lParam, 4, "Int")
ToolTip "Нажата левая кнопка в: " x ", " y
SetTimer () => ToolTip(), -1000 ; Скрыть через 1 сек
; return 1 ; Раскомментируйте, чтобы заблокировать клик для системы
}
}
result := DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "Ptr", wParam, "Ptr", lParam, "Ptr")
; Передаем управление следующему хуку в цепочке
return result
} |
 ahk | Code: | #Requires AutoHotkey v2.0
Persistent ; Скрипт должен продолжать работу для получения сообщений
; Константы WinAPI
WH_MOUSE_LL := 14
WM_LBUTTONDOWN := 0x0201
HC_ACTION := 0
; 1. Создаем Callback. "Fast" рекомендуется для хуков ввода.
mouseCallback := CallbackCreate(LowLevelMouseProc, "Fast", 3)
; 2. Устанавливаем хук
hHook := DllCall("SetWindowsHookEx", "Int", WH_MOUSE_LL, "Ptr", mouseCallback, "Ptr", DllCall("GetModuleHandle", "Ptr", 0, "Ptr"), "UInt", 0, "Ptr")
if !hHook {
MsgBox "Не удалось установить хук!"
ExitApp
}
; Удаляем хук при закрытии скрипта
OnExit((*) => DllCall("UnhookWindowsHookEx", "Ptr", hHook))
; --- Сама функция перехвата ---
LowLevelMouseProc(nCode, wParam, lParam)
{
if nCode = HC_ACTION {
; Пример: ловим нажатие левой кнопки мыши
if wParam = WM_LBUTTONDOWN
{
if !GetKeyState("Shift", "P")
return DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "Ptr", wParam, "Ptr", lParam, "Ptr")
; Извлекаем координаты из структуры MSLLHOOKSTRUCT
x := NumGet(lParam, 0, "Int")
y := NumGet(lParam, 4, "Int")
hWnd := DllCall("WindowFromPoint", "Int64", NumGet(lParam, 0, "Int64"), "Ptr")
if (hWnd) {
rootHWnd := DllCall("GetAncestor", "Ptr", hWnd, "UInt", 2)
classBuffer := Buffer(512)
DllCall("GetClassName", "Ptr", rootHWnd, "Ptr", classBuffer, "Int", 256)
hitTest := DllCall("SendMessage", "Ptr", rootHWnd, "UInt", 0x84, "Ptr", 0, "Ptr", (y << 16) | (x & 0xFFFF))
isTitleBar := (hitTest == 2) ; HTCAPTION
;MsgBox "Класс: " . StrGet(classBuffer) . "`nЗаголовок: " . (isTitleBar ? "Да" : "Нет")
ToolTip "Класс: " . StrGet(classBuffer) . "`nЗаголовок: " . (isTitleBar ? "Да" : "Нет")
SetTimer () => ToolTip(), -2000 ; Скрыть через 1 сек
}
;ToolTip "Нажата левая кнопка в: " x ", " y
;SetTimer () => ToolTip(), -1000 ; Скрыть через 1 сек
; return 1 ; Раскомментируйте, чтобы заблокировать клик для системы
}
}
result := DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "Ptr", wParam, "Ptr", lParam, "Ptr")
; Передаем управление следующему хуку в цепочке
return result
} |
Перевод на Autorun не занял много времени. Пришлось правда добавить обработчик очереди сообщений вместо
| Code: | hHook = DllCall("SetWindowsHookEx", _
"Int", WH_MOUSE_LL, _
"Ptr", MyMouse.Ptr, "Ptr", DllCall("GetModuleHandleW", "Ptr", 0, "Ptr"), "UInt", 0, "Ptr") |
Ну и вместо
| Code: | # Извлечение координат из структуры MSLLHOOKSTRUCT
#x = NumGet(lParam, 0, "Int")
#y = NumGet(lParam, 4, "Int") |
Я просто использовал MouseGetPos("x","y")
 aucfg | Code: | Pragma IncludeOnce
Global WH_MOUSE_LL = 14, HC_ACTION = 0
Global MyMouse = Callback("LowLevelMouseProc", "int;wparam;lparam")
#hHook = DllCall("SetWindowsHookEx", _
# "Int", WH_MOUSE_LL, _
# "Ptr", MyMouse.Ptr, "Ptr", DllCall("GetModuleHandleW", "Ptr", 0, "Ptr"), "UInt", 0, "Ptr")
RunThread("MouseHook")
Func MouseHook()
Local hHook
hHook = DllCall("SetWindowsHookEx", _
"Int", WH_MOUSE_LL, _
"Ptr", MyMouse.Ptr, "Ptr", 0, "UInt", 0, "Ptr")
Local buf = Buffer(auX64 ? 56 : 28)
While 1
DllCall("GetMessage", "ptr", buf.ptr, "hwnd", -1, "uint", 0, "uint", 0)
DllCall("TranslateMessage", "ptr", buf.ptr)
DllCall("DispatchMessage", "ptr", buf.ptr)
Wend
EndFunc
Func LowLevelMouseProc(nCode, wParam, lParam)
# WM_LBUTTONDOWN
If (nCode = HC_ACTION) And (wParam = 0x0201) Then
If IsPressed(0x10) Then
# Извлечение координат из структуры MSLLHOOKSTRUCT
#x = NumGet(lParam, 0, "Int")
#y = NumGet(lParam, 4, "Int")
MouseGetPos("x","y")
# Дескриптор окна под курсором
Local hWnd = DllCall("WindowFromPoint", "Int64", MakeInt(x, y, 2), "Ptr")
If hWnd Then
rootHWnd = DllCall("GetAncestor", "Ptr", hWnd, "UInt", 2)
classBuffer = Buffer(512)
DllCall("GetClassName", "Ptr", rootHWnd, "Ptr", classBuffer.Ptr, "Int", 256)
hitTest = DllCall("SendMessage", "Ptr", rootHWnd, "UInt", 0x84, "Ptr", 0, "Ptr", MakeInt(x, y, 0))
isTitleBar = (hitTest = 2) # HTCAPTION
If isTitleBar And classBuffer.GetStr() = "TLister" Then AlignListerWindow()
#MsgBox("Класс: " & classBuffer.GetStr() & auCRLF & "Заголовок: " & (isTitleBar ? "Да" : "Нет"))
EndIf
# Return 1 # Заблокировать клик для системы
EndIf
EndIf
# Передача управления следующему хуку в цепочке
Return DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "wParam", lParam, "Ptr", lParam, "Ptr")
EndFunc |
В код добавлена проверка класса TLister: если под курсором находится заголовок листера, будет вызвана AlignListerWindow, подгоняющая его размеры под окно тотала.
Вроде бы все работает, но ИИ советует использовать другой метод через функцию RegisterRawInputDevices
| Code: | Если вы используете Raw Input (как мы обсуждали ранее) — вам вообще не нужны эти хуки, так как Raw Input еще более безопасен и не тормозит систему. |
Там более сложный код получается, завтра скину. |
|