View previous topic :: View next topic |
Author |
Message |
AkulaBig
Joined: 03 Dec 2008 Posts: 328
|
(Separately) Posted: Mon Jun 09, 2025 21:55 Post subject: |
|
|
Loopback wrote: | Очень похоже на наблюдаемое поведение. |
Возможно конкретный плагин устанавливается дольше, чем другие и действительно отключает или что-то подобное делает. В общем очень похоже, что вы правильно ситуацию описали. Только вот дергать похоже не надо. Я просто подождал какое-то время и все заработало. Отсюда я сделал вывод, что ShellExec(COMMANDER_PATH & "\Utilities\TCPlugman\Plugman.exe", "/Restart") надо выполнять с задержкой, хотя не очень этого хочется. Соответственно в эту строку надо вставить /WAIT, а у меня что-то не получилось. Я так и не пойму, где надо кавычки и какие ставить. Кажется пишешь впереди ~/HIDE /WAIT запятая и дальше приведенная строка. Но почему-то не работает так. Помнится я разбирался с этим, но опять забыл.
Добавлено спустя 1 час:
Похоже вы совершенно правы. Чтобы Autorun сработал, надо именно чего-нибудь дернуть. Сейчас ждал долго. Не работает. Мышкой начал щелкать в другом окне, после этого заработала перезагрузка. И проблема только при установке wdx-плагинов. Что-то можно с этим сделать? |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1526
|
(Separately) Posted: Mon Jun 09, 2025 23:45 Post subject: |
|
|
AkulaBig wrote: | в эту строку надо вставить /WAIT, |
Не, сюда не надо вставлять WAIT, которая согласно документации ждёт завершения процесса. Тут, видимо, простой Sleep перед ShellExec нужен.
AkulaBig wrote: | И проблема только при установке wdx-плагинов. |
Ну вот и выяснили. Значит, тотал выгружает wdx-плагины при установке нового.
AkulaBig wrote: | Что-то можно с этим сделать? |
Наверно, можно попробовать запретить выгрузку Autorun директивой AutorunBlockUnload. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 328
|
(Separately) Posted: Tue Jun 10, 2025 05:51 Post subject: |
|
|
Loopback wrote: | запретить выгрузку Autorun директивой AutorunBlockUnload. |
То, что нужно! Спасибо.
Добавлено спустя 1 час 6 минут:
По факту использования для хинтов портянок со сведениями из MI пришел к выводу, что это действительно не всегда удобно. Собственно решение проблемы понятно. Сделать кнопку в Панели настроек для переключения вида подсказок. Простые хинты, с Ctrl расширенные, либо всегда расширенные.
Но есть в ТС такой ключик FileTipWindowsOnIcon. Он позволяет отключить, либо ограничить именем файла подсказки над именем и другими колонками ТС, а хинты показывать над иконкой.
А можно такое в Autorun реализовать? То-есть чтобы подсказка из полей Autorun показывалась над иконкой файла?
Соответственно в строке If IsPressed (0x10) Then подставить не нажатие клавиши, а расположение над иконкой. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1526
|
(Separately) Posted: Tue Jun 10, 2025 12:53 Post subject: |
|
|
AkulaBig wrote: | чтобы подсказка из полей Autorun показывалась над иконкой файла? |
Не совсем понятно. Если включить эту опцию, то подсказка будет появляться только над значками, неважно, из полей Autorun получает она информацию, или из других.
Но при желании, полагаю, можно и без этой опции определить, находится ли указатель мыши в момент запроса полей Autorun в зоне над значком. Алгоритм должен быть примерно такой:
- узнать, включены ли значки
- узнать их размер
- получить панель, над которой находится курсор (ItemAtCursor)
- получить хэндл панели (RequestInfo)
- получить координаты этой панели (WinGetPos)
- вычислить прямоугольник, где может находиться курсор, с помощью размера значка
- получить координаты курсора (MouseGetPos)
- проверить, находится ли курсор в границах прямоугольника |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 328
|
(Separately) Posted: Tue Jun 10, 2025 14:46 Post subject: |
|
|
Loopback wrote: | Если включить эту опцию, то подсказка будет появляться только над значками, неважно, из полей Autorun получает она информацию, или из других. |
Я имел ввиду, что сделать такое средствами Autorun. То-есть мне совершенно не нравится, когда подсказок нет совсем. Я-бы использовал для показа подсказок стандартный ключ, а над иконкой показывал-бы средствами Autorun.
Loopback wrote: | Но при желании, полагаю, можно и без этой опции определить, находится ли указатель мыши в момент запроса полей Autorun в зоне над значком |
Да, именно это меня и заинтересовало. Спасибо за алгоритм. Только один вопрос. С Ctrl+ЛКМ подсказка работает просто отвратительно. Приходится очень неудобно перемещать мышь, чтобы она появлялась. То-есть сделать такой режим основным я не за что не решусь. Поэтому хотелось-бы с этой моей хотелкой разобраться. Мышь себя будет естественно вести? То-есть я буду просто вести мышью по иконкам и подсказка просто будет появляться без всяких выкобениваний? В общем стандартно, как при использовании ключа ТС?
Добавлено спустя 30 минут:
Похоже не рабочая у меня хотелка. Проверил как работает вывод значков. Раз мы выводим хинты средствами ТС, то нельзя над полями выводить стандартный хинт, а над иконкой из Autorun. Для этого нужен код, никак не связанный с ТС. Так что сделаю просто выбор между стандартным выводом и расширенным. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 772
|
(Separately) Posted: Tue Jun 10, 2025 17:46 Post subject: |
|
|
Loopback wrote: | Не представляю, как сюда блокировку притянуть. |
Как вы, наверное, догадались, данную статейку я почитал на досуге, чтобы лучше понимать механизм сообщений, но она меня навела на одну мысль.
Если откинуть баги Гислера и Lazarus, остается только один вариант: сообщение с IDCANCEL посылается специально и с определенной целью. Быть может, в работе ТСх64 есть некий критичный момент, когда появление диалогового окна нежелательно и может привести к проблемам, именно поэтому сразу посылается сообщение о закрытии.
Например, AkulaBig недавно писал, что при использовании TCFS2 значок Тотала на панели задач пропадает, а потом опять появляется. Я тоже заметил этот "прикол", характерный только для ТСх64. Но дело не только в TCFS2. Такое происходит и при отправке сообщений окну ТС из Autorun. То есть, складывается впечатление, что ТСх64, обрабатывыая полученные сообщения и выполняя какие-то внутренние операции, скрывает главное окно и повторно его инициализирует. По крайней мере, так выглядит визуально на панели задач.
А теперь допустим, что в такой момент что-то произойдет и значок на панели задач так и не появится. Вот именно о таком критичном моменте я и говорил. Но это только мысли, которые к реальности могут не иметь никакого отношения.
Loopback wrote: | Экземпляр контрола штука не всегда надёжная. Он постоянен только тогда, когда количество созданных контролов в процессе работы не изменяется, т.е. они не удаляются и не создаются новые. |
Спасибо за объяснения. Теперь я, кажется, стал это лучше понимать.
Loopback wrote: | Для получения хэндлов элементов главного окна лучше пользоваться RequestInfo. |
Да, забыл о таком, думал с хэндлами прокатит. Но этот вариант действительно представляется более надежным. Только я не совсем понял, какой именно индекс заменяет TMyPanel6 в ТСх86, потому что именно в это окно я хотел рисовать вентихлятор )
Обновленная функция, которая не требует отдельных файлов с иконками (иконка берется из основного окна ТС сообщением 0x7f и поворачивается вызовом функции PlgBlt из gdi32.dll)
 Hidden text Code: | RegisterCommand 62016 "RotateIcon"
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(100)
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)
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 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", 16, "int", 16,"ptr")
Local hbmDB2 = DllCall("CreateCompatibleBitmap", "ptr", hdcWndDC, "int", 16, "int", 16,"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", 16, _
"int", 16, _
"uint", 0, _
"ptr", 0, _
"uint", 0x0003)
Local pt = Buffer(24)
pt.Zero()
If c = 1 Then
pt.SetNum(0, "int", 16, "int", 0, _
"int", 0, "int", 0, _
"int", 16, "int", 16)
ElseIf c = 2 Then
pt.SetNum(0, "int", 16, "int", 16, _
"int", 16, "int", 0, _
"int", 0, "int", 16)
ElseIf c = 3 Then
pt.SetNum(0, "int", 0, "int", 16, _
"int", 16, "int", 16, _
"int", 0, "int", 0)
ElseIf c = 4 Then
pt.SetNum(0, "int", 0, "int", 0, _
"int", 0, "int", 16, _
"int", 16, "int", 0)
EndIf
DllCall("PlgBlt", _
"ptr", hdcBltDC, _
"ptr", pt.Ptr, _
"ptr", hdcMemDC, _
"int", 0, _
"int", 0, _
"int", 16, _
"int", 16, _
"ptr", 0, _
"int", 0, "int", 0)
WinGetPos("x", "y", "w", "h", hWnd)
DllCall("BitBlt", _
"ptr", hdcWndDC, _
"int", w - 20, _
"int", 2, _
"int", 16, _
"int", 16, _
"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 |
Старая функция по-прежнему доступна и вызывается с удержнием CTRL.
Loopback wrote: | - узнать, включены ли значки
- узнать их размер
- получить панель, над которой находится курсор (ItemAtCursor)
- получить хэндл панели (RequestInfo)
- получить координаты этой панели (WinGetPos)
- вычислить прямоугольник, где может находиться курсор, с помощью размера значка
- получить координаты курсора (MouseGetPos)
- проверить, находится ли курсор в границах прямоугольника |
Норм алгоритм, но нужно на практике проверить, как он будет работать. Но я не стал бы заморачиваться. Когда приходится дополнительно куда-то целиться, это немного напрягает. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 328
|
(Separately) Posted: Tue Jun 10, 2025 20:58 Post subject: |
|
|
Orion9 wrote: | Когда приходится дополнительно куда-то целиться, это немного напрягает. |
Представляете, многие используют подсказки над иконками. Меня это тоже удивляет.
Orion9 wrote: | Норм алгоритм, но нужно на практике проверить, как он будет работать. |
А уже понятно, что он мне не подойдет. Так как он полностью зависит от настроек ТС. То-есть я хотел чтобы над колонками всплывали стандартные хинты, а над иконкой расширенные. Но такого стиля в ТС нет. Только если вообще как-то через Autorun делать. Но это чересчур. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1526
|
(Separately) Posted: Tue Jun 10, 2025 22:23 Post subject: |
|
|
AkulaBig wrote: | Я-бы использовал для показа подсказок стандартный ключ, а над иконкой показывал-бы средствами Autorun. |
В теории можно, но по факту... Придется обрабатывать сообщение WM_MOUSEMOVE, которое заворачивать в скриптовую часть, как по мне, не лучшая затея. И выполнять сопутствующие расчеты. И еще придется бороться с встроенной подсказкой или отключать ее совсем. В общем, я бы с этим не связывался.
AkulaBig wrote: | Мышь себя будет естественно вести? То-есть я буду просто вести мышью по иконкам и подсказка просто будет появляться без всяких выкобениваний? |
Понятия не имею. Если пользоваться стандартной подсказкой тотала, вряд ли будут принципиальные отличия.
Orion9 wrote: | Только я не совсем понял, какой именно индекс заменяет TMyPanel6 в ТСх86 |
Скорее всего никакой, не у всех элементов окна есть соответствующие индексы. А вот, например, индексы 11, 12 ведут на скрытые панели, повторяющие текст видимых, но ими не являющиеся. Так что тут только экспериментировать.
Orion9 wrote: | Но я не стал бы заморачиваться. |
Я и не собираюсь, поэтому только алгоритм, а не готовый код  |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 328
|
(Separately) Posted: Tue Jun 10, 2025 23:42 Post subject: |
|
|
Loopback wrote: | я бы с этим не связывался.
|
Я тоже пришел к такому выводу. Смысла нет связываться с этим. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 772
|
(Separately) Posted: Wed Jun 11, 2025 00:28 Post subject: |
|
|
AkulaBig wrote: | Представляете, многие используют подсказки над иконками. Меня это тоже удивляет. |
Это вопрос привычки, как мне кажется. На мой взгляд, удобно вызывать подсказки с удержанием различных клавиш-модификаторов, например CTRL или CTRL+SHIFT. Но можно и CapsLock использовать в некоторых случаях.
AkulaBig wrote: | То-есть я хотел чтобы над колонками всплывали стандартные хинты, а над иконкой расширенные. |
Используйте CapsLock для переключения, и вся проблема. Буквально один вызов нужно добавить для проверки состояния:
Code: | If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then Return |
Модификаторы не советую, так как они не работают в TCx64.
Раз уж речь зашла о подсказках, была у меня ещё одна в давнишних проспектах:
 Hidden text Code: | ControlSetHint /F /D:50 28 "ButtonBarHints"
Func ButtonBarHints()
#If Not IsPressed(0x11) Then Return
# проверка CapsLock
If BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1) = 0 Then Return
Local x, y, w, h, _
mx, my, idx, _
row, rows, rowh, _
def, txt, b, extra
# запрос дескриптора панели
Local hWnd = RequestInfo(28)
If hWnd = 0 Then
Return "Окно панели не найдено " & hWnd
EndIf
# чтение информации о файле панели в wincmd.ini
IniRead def %COMMANDER_INI% "Buttonbar" "Buttonbar" "%COMMANDER_PATH%\DEFAULT.BAR"
# чтение текста окна панели
txt = WinGetText(hWnd)
# на панель загружен временный .bar файл
If Not StrPos(def, txt) Then
def = COMMANDER_PATH & "\Bars\" & txt
EndIf
# проверка существования файла панели
def = Set (def)
If Not FileExist(def) Then
Return "Файл панели не найдена " & def
EndIf
# координаты и размеры окна панели
WinGetPos("x", "y", "w", "h", hWnd)
# координаты указателя мыши
MouseGetPos("mx", "my")
# чтение информации о высоте кнопок
IniRead b %COMMANDER_INI% "Buttonbar" "Buttonheight"
# вычисление количества рядов кнопок на панели
rows = Floor(h/b)
extra = Mod(h,b)
# высота одного ряда
rowh = b + Floor(extra/rows)
# номер ряда под указателем
row = Ceil((my - y )/rowh)
# индекс кнопки в ряду
idx = (Floor((mx - x)/b) + 1) + (row-1)*(Floor(w/b))
# чтение информации о кнопке из .bar фйла
Local sMenu, sButton, sCmd, sParam, sPath, sIcon
IniRead sMenu %def% "Buttonbar" %'"menu" & idx' ""
IniRead sButton %def% "Buttonbar" %'"button" & idx' ""
IniRead sCmd %def% "Buttonbar" %'"cmd" & idx' ""
IniRead sParam %def% "Buttonbar" %'"param" & idx' ""
IniRead sPath %def% "Buttonbar" %'"path" & idx' ""
IniRead sIcon %def% "Buttonbar" %'"iconic" & idx' ""
# возврат текста
Return "bar x=" & x & " y=" & y & " w=" & w & " h=" & h & auCRLF & _
"mouse x=" & mx & " y=" & my & auCRLF & _
"index= " & idx & auCRLF & _
"rows=" & rows & " extra=" & extra & " hight=" & rowh & " row=" & row & auCRLF & _
"-----------" & auCRLF & _
"menu=" & sMenu & auCRLF & _
"button=" & sButton & auCRLF & _
"cmd=" & sCmd & auCRLF & _
"param=" & sParam & auCRLF & _
"path=" & sPath & auCRLF & _
"iconic=" & sIcon
EndFunc |
Дополнительная подсказка к главной панели инструментов, которая отображается при включенном CapsLock или зажатом CTRL. Эта тема всплывала некоторе время назад, но чуть в другом контексте. Тут главное индекс расчитать правильно, что не так сложно, если на панели нет разделителей. И сейчас алгоритм делает именно это, он не учитывает возможные разделители в .bar файле. Поэтому хорошо будет работать, если на панели не используются разделители.
Разделители нужно учитывать отдельно, и с этим есть проблема. Но пока функция только эксперементальная, делал её только посмотреть, что из может выйти и как будет смотреться такая подсказка. Если одним словом, то понравилась.
Loopback wrote: | Скорее всего никакой, не у всех элементов окна есть соответствующие индексы. |
Ну, я так и подумал, только решил уточнить на всякий случай. Будем продолжать эксперементировать и пробовать разные индексы. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 328
|
(Separately) Posted: Wed Jun 11, 2025 04:21 Post subject: |
|
|
Orion9 wrote: | удобно вызывать подсказки с удержанием различных клавиш-модификаторов, например CTRL или CTRL+SHIFT. |
Дак не работают они в ТС64. И мне не нравится как они работают. Приноравливаться надо.
Orion9 wrote: | можно и CapsLock использовать |
Надо попробовать. Еще ScrollLock надо проверить.
Orion9 wrote: | Буквально один вызов нужно добавить для проверки состояния |
Мы эту тему обсуждали, так что я помню.
Orion9 wrote: | отображается при включенном CapsLock или зажатом CTRL. |
Ctrl в ТС64 не работает. Так что остается только CapsLock.
Думаю без кнопки переключения в настройках не обойтись.
Добавлено спустя 26 минут:
ScrollLock не работает, PrintScreen работает. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 328
|
(Separately) Posted: Wed Jun 18, 2025 21:39 Post subject: |
|
|
Наконец-то форум опять заработал.
Orion9
А вы знаете, что If BitAND(DllCall("GetKeyState", "int", 0x11, "short"), 1) = 0 Then Return работает и в ТС64? Правда по хитрому. Конечно нажатие подцепиться не может, а вот переключение подхватывается. Именно на основании этого я подобрал работающее сочетание Ctrl+Break. работают много какие клавиши ,но они не удобны для использования, так как много где задействованы. Правда я в сборке сделал кнопочку для переключения вида подсказок. |
|
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
|