Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Autorun
Goto page Previous  1, 2, 3 ... 210, 211, 212
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Orion9



Joined: 01 Jan 2024
Posts: 918

Post (Separately) Posted: Tue Oct 28, 2025 13:51    Post subject: Reply with quote

Loopback wrote:
Ну да, с Ctrl вряд ли удастся случайно что-то утянуть Smile

Ну а Гислеру что мешает сделать то же самое?

Кто не в курсе о чем речь, напоминаю ответ маэстро в этой теме.

Ну да, я торопился и забыл написать про CTRL, но что это меняет? Можно и на Shift заменить, результат будет тем же:
Code:
Switch uMsg
   Case WM_LBUTTONDOWN
      If BitAND(wParam, 0x0004) Then

Т.ч. мой вопрос остаётся в силе: ну и где здесь "случайное" перетаскивание кнопок? Что-то я его не наблюдаю.

Более того, можно было и без модификаторов обойтись, но у Гислера своя оконная процедура висит и мешает. В частности это приводит к тому, что при претаскивании кнопки на саму себя происходит ее запуск. Побороть может и получится, но будет сложно, поскольку простой выход из процедуры без вызова оригинальной приводит к другим проблемам.
Code:
Case WM_LBUTTONDOWN
  If BitAND(wParam, 0x0004) Then
     MouseGetPos("x","y")
     IsDrag = 0
     If DllCall("DragDetect", "hwnd", hWnd, "int64", MakeInt(y, x, 2)) Then
        IsDrag = 1
        WinSetStyle(0x80000, 3, hWnd)
        DllCall("SetLayeredWindowAttributes", "hwnd", hWnd, "ptr", 0, "byte", 128, "dword", 2)
        Return 1       
     EndIf
  EndIf   
Case WM_LBUTTONUP
  If IsDrag = 1 Then
     WinSetStyle(0x80000, 5, hWnd)
     IsDrag = 0
     Return 1
  EndIf

Кстати, вы заметили, что я использовал MakeInt? Руки так и чесались Laughing

В общем, хотел я по быстрому сделать модуль, ведь основная функция была уже готова, оставалось только ее разбить на блоки и внести небольшие изменения, но поскольку времени было совсем мало, процесс затянулся.

Однако удалось добиться состояния промежуточной готовности:
 Bars.aucfg

Сейчас подсказка вызывается по Ctrl, Shift и CapsLock. Ctrl добавляет карту панели и имеет возможность перетаскивания кнопок. Пока при перетаскивании показываются только индексы опрации. Пересобрать панель будет делом техники, но сначала нужно добавить дополнительные проверки и провести больше тестов. Например усовершенствовать блок с масштабированием экрана и оптимизировать количество вызовов. Также нужно что-то придумать, как обрабатывать временно загруженную панель, файл которой не находится в корне ТС или подкаталоге \Bars. Сейчас такая панель работать не будет.

Loopback wrote:
Думаю, можно и полностью исправить, но тогда придется отказаться от создания диалога с помощью DialogBox и полностью создать свое окно с нуля.

А откуда уверенность, что это поможет?
Loopback wrote:
Что-то может быть, конечно, но проблема с потоком маловероятно что связана с ним.

Согласен. Я больше имел в виду дурацкие приколы с загрузкой графического объекта.
Loopback wrote:
Из плагинов статистики нет, слишком много затрат для реализации.

То, что некоторые вещи реализовать сложно, это понятно. Но какие сложности с SetHotkeyAction? Разве во время парсинга вы не можете собрать статистику, что привязано к этому вызову? У меня много модулей, и в каждом что-то висит на SetHotkeyAction. Со временем забываешь, что именно. Можно конечно простым поиском по всем файлам найти, но ведь лень же да и не удобно это. Куда лучше было бы вызвать GetState("SetHotkeyAction") и всё увидеть.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1641

Post (Separately) Posted: Tue Oct 28, 2025 14:25    Post subject: Reply with quote

Orion9 wrote:
Побороть может и получится, но будет сложно, поскольку простой выход из процедуры без вызова оригинальной приводит к другим проблемам.

Тут еще проблема с x64. Новый вариант не пробовал, но предыдущий валит тотал x64 при выходе. С похожей проблемой я столкнулся, когда пытался делать сабклассинг окна тотала. Ставится-то он без проблем, но уже не снимается и тотал крашится. Т.е. выгружать плагин нельзя. Похоже здесь та же проблема.

Orion9 wrote:
А откуда уверенность, что это поможет?

Я делал тесты, меняя ID кнопки Отмена с IDCANCEL (2) на другой. В этом случае диалог появлялся всегда. Но тогда теряется возможность закрыть окно кнопкой Esc и что-то еще вроде было. При этом диалог, создаваемый DialogBox, имеет свой обработчик клавиш, не позволяющий что-то изменить.

Orion9 wrote:
Разве во время парсинга вы не можете собрать статистику, что привязано к этому вызову?

Нет API для передачи этих данных из плагина. Это дело не пяти минут. Пока слишком много более приоритетных задач.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 918

Post (Separately) Posted: Tue Oct 28, 2025 20:31    Post subject: Reply with quote

Loopback wrote:
Новый вариант не пробовал, но предыдущий валит тотал x64 при выходе.

Похоже, что так. В Win11 это происходит "тихо", даже не сразу заметил. Ну и ладно. Я все-равно этой версией редко пользуюсь, в том числе из-за разных проблем с Autorun.
Loopback wrote:
Ставится-то он без проблем, но уже не снимается и тотал крашится.

C окном ТС вероятно так и есть, однако в моем случае если добавить к секции финализации, то краш уходит даже на Win8:
Code:
Pragma AutorunFinalizeSection

If gHBarWndProc > 0 Then
    DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
            "hwnd", hBarWnd, "int", -4, "long_ptr", gHBarWndProc, "ptr")
EndIf

Loopback wrote:
Я делал тесты, меняя ID кнопки Отмена с IDCANCEL (2) на другой. В этом случае диалог появлялся всегда.

Интересный ход. Возможно из этого получится что-то выжать и обойти проблему, но всё-таки хотелось докапаться до причины, почему это вообще происходит. Сдается мне, что все это может быть связано - вылеты потоков, окон диалога, глючная загрузка bitmap и т.д. Сделал на скорую руку кнопку для теста потока на основе вашей первоначальной функции перебора торрента:
 Hidden text

Почему-то был уверен, что баг проявится быстро, однако не всё так просто. У меня используется Jinn'sLiveUSB 11.2.2 на 9800 файлов, но можно прописать любой большой торрент и увеличить количество циклов в For..Next.

В общем, не сразу, но через какое-то время потоки, которые также запущены в фоне (заголовок, подсчет времени воспроизведения, пинг трех адресов и т.д.) начинают отваливаться. Удивительно, но сам поток TorrentThreadTest мне так и не удалось завалить. Видимо он слишком простенький для этого, не использует какие-то критические части Autorun. Но проблема определенно есть.
Loopback wrote:
Нет API для передачи этих данных из плагина. Это дело не пяти минут.

Жалко, конечно, но что поделать. Как-нибудь пока проживем без этого )
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1641

Post (Separately) Posted: Wed Oct 29, 2025 21:36    Post subject: Reply with quote

Orion9 wrote:
если добавить к секции финализации, то краш уходит

Я это попробовал в первую очередь, но не помогло. Во всяком случае на 10.

Orion9 wrote:
Но проблема определенно есть.

Ну это понятно. Как появится возможность, буду тестировать.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 918

Post (Separately) Posted: Thu Oct 30, 2025 20:48    Post subject: Reply with quote

Loopback wrote:
Я это попробовал в первую очередь, но не помогло. Во всяком случае на 10.

Если не ошибаюсь, на восьмерке тоже пару раз при выходе возникла ошибка даже с кодом финализации. Т.ч. возможно, что проблема не всегда просто проявляется, как и в случае с MsgBox().

Доделал я функцию drag-n-drop на панели, очень хотелось посмотреть, как она будет работать. Версия чисто DEMO, пока есть еще ряд недоработок, связанных прежде всего с масштабированием экрана. Все работает и при масштабировании, но если поменять размер кнопок, то индекс перестанет правильно определяться. При стандартном dpi проблем нет. В будущем надо будет и других улучшений добавить, например откат действия и бэкап панели. Пока бэкап нужно обязательно делать вручную, а то мало ли что.

В общем, если кто-то будет пробовать, только на свой страх и риск ) Но имхо, само перетаскивание классно смотрится и "ощущатся", жаль, что Гислер не хочет его реализовывать.

 Bars.aucfg
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 918

Post (Separately) Posted: Sat Nov 01, 2025 00:27    Post subject: Reply with quote

Loopback
Почему-то вызов не работает:
Code:
If DllCall("Ntdll.dll\IsWindows8Point1OrGreater", "bool") Then

Есть идеи почему?
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 918

Post (Separately) Posted: Sat Nov 01, 2025 12:54    Post subject: Reply with quote

Loopbak
Метод с явным указанием ANSI
Code:
lst.LoadFromFile(sFile, "ANSI")

загружает юникодный файл (UTF-16) полностью и без проблем. Так задумано, или ошибка?
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1641

Post (Separately) Posted: Sat Nov 01, 2025 19:31    Post subject: Reply with quote

Orion9 wrote:
Почему-то вызов не работает

Макрос еrror возвращает ошибку 2 - отсутствие функции в dll.

А всё потому, что это не реальная функция в dll, а враппер. В файле VersionHelpers.h он задается так:


Code:

VERSIONHELPERAPI
IsWindows8Point1OrGreater()
{
    return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0);
}

VERSIONHELPERAPI
IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor)
{
    OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 };
    DWORDLONG        const dwlConditionMask = VerSetConditionMask(
        VerSetConditionMask(
        VerSetConditionMask(
            0, VER_MAJORVERSION, VER_GREATER_EQUAL),
               VER_MINORVERSION, VER_GREATER_EQUAL),
               VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);

    osvi.dwMajorVersion = wMajorVersion;
    osvi.dwMinorVersion = wMinorVersion;
    osvi.wServicePackMajor = wServicePackMajor;

    return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}


Orion9 wrote:
Так задумано, или ошибка?

Так задумано. Если файл содержит BOM, он всегда читается в кодировке, определяемой BOM. Указываемые здесь значения служат для интерпретации файла без BOM. Наверно, это стоит уточнить в справке.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 918

Post (Separately) Posted: Sat Nov 01, 2025 20:41    Post subject: Reply with quote

И всё-таки я ещё раз спрошу у Гислера: ну и где здесь "случайное" перетаскивание кнопок на панели?

 Hidden text

Ладно, шучу я. Понятно, что он просто не захотел этим заморачиваться, а я взял и заморочился Smile

Последняя версия модуля.
 Bars.aucfg

Добавлена отмена действия и возврат к первоначальной панели, а также возможность создания бэкапов. Исправлено масштабирование экрана. Ветка с загрузкой панели в ANSI или UTF-16 получается не сильно нужна и остается пока недоделанной по причинам описанным выше. Однако важное замечание: если панель хранится в юникоде, по умолчанию она сохраняться будет как ANSI, если не поставить соответствующую галочку в меню. Галочка между сессиями не сохраняется, тоже имейте это в виду. У меня все панели храняться в ANSI, а к модулю я могу еще вернуться не скоро, хотя автосохранение в корректной кодировке само напрашивается.

Окно панели хранит только имя файла, информация о пути недоступна. Поэтому файлы ищутся только в каталоге ТС или подкаталоге \Bars. Если и там, и там есть одинаковое имя файла, это может привести к проблемам.

У Гислера висит своя оконная процедура, во избежание проблем приходится передавать ей управление. Чтобы избавится от клика, которая посылает эта процедура, используется подмена х-координаты указателя мыши:
Code:
MouseGetPos("x","y")
lParam = MakeInt(y, x + 200, 2)

Клик происходит на 200 пикселей правее и не приводит к запуску кнопки. Но если используется слишком большое масштабирование, запуск может произойти.

В остальном проблем не замечено. Пользуюсь с большим удовольствием )

Loopbak wrote:
А всё потому, что это не реальная функция в dll, а враппер

Понятно. Спасибо, что разобрались. Хотел было использовать что-то вроде:
Code:
Local pX, pY
Local nScale = 0, bRes
If DllCall("Ntdll.dll\IsWindows8Point1OrGreater", "bool") Then
   bRes = DllCall("Shcore.dll\GetDpiForMonitor", "hwnd", hMon, "int", 0, "uint*", @pX, "uint*", @pY)
   bRes = DllCall("Shcore.dll\GetScaleFactorForMonitor", "hwnd", hMon, "dword*", @nScale)
   nDPI = pX       
EndIf

Но почитав немного про эти функции и про DPI в целом, понял, что оно того не стоит.
Loopbak wrote:
Так задумано. Если файл содержит BOM, он всегда читается в кодировке, определяемой BOM.

Имхо, правильно задумано. А если во взятом таким образом массиве есть маркер BOM то сохраняться через SaveToFile он тоже будет корректно?

Добавлено спустя 4 минуты:

Забыл написать, что меню вызывается по правому клику мыши с зажатым Ctrl.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1641

Post (Separately) Posted: Sat Nov 01, 2025 22:22    Post subject: Reply with quote

Orion9 wrote:
В остальном проблем не замечено.

Ну что же, как минимум с точки зрения "Proof of Concept" неплохо. Работает с указанным ограничением по расположению. Только пришлось добавить /R в IniRead, у меня перенаправление включено.

Orion9 wrote:
А если во взятом таким образом массиве есть маркер BOM то сохраняться через SaveToFile он тоже будет корректно?

Маркер это принадлежность файла, после чтения текста он нигде не сохраняется. В SaveToFile необходимо явно указывать кодировку (если она отличается от умолчальной) и нужно ли записывать BOM.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 918

Post (Separately) Posted: Sun Nov 02, 2025 00:33    Post subject: Reply with quote

Loopbak wrote:
Ну что же, как минимум с точки зрения "Proof of Concept" неплохо.

А с точки зрения чего же ещё? ) Как говорится, могЁм когда умеем. А вот маэстро со своими ответами в стиле "это невозможно" лишь портит себе репутацию. Что вообще значит невозможно? Любой грамотный специалист знает, что нет такого слова в принципе: при правильно настроенном контроллере головного мозга и прямом драйвере руки.sys возможно всё Mr. Green
Loopbak wrote:
Только пришлось добавить /R в IniRead, у меня перенаправление включено.

Ах да, как-то забыл об этом совсем, надо будет подправить в будущих версиях. Хотя кто знает, вдруг Гислеру загорится и он решит сделать свой драгендроп в ТС, тогда этот модуль потеряет в ценности. Правда там еще подсказка о кнопках всплывает, а для меня она значит больше, чем перетаскивание. Впрочем, Гислеру и подсказку ничего не мешает сделать такую же, или почти такую же.
Loopbak wrote:
В SaveToFile необходимо явно указывать кодировку (если она отличается от умолчальной) и нужно ли записывать BOM.

Понятно. В общем, надо будет всё это исправить и учесть, но не в ближайшее время. Сейчас мне нужно, к сожалению, отправиться восвояси. Как говорится, теперь я свободен как udp-пакет в полете Mr. Green Но надеюсь не на долго )
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 210, 211, 212
Page 212 of 212

 
Jump to:  
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