Autorun
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
При попытке удалить файл
получил отворот
Код: Выделить всё
FileDelete(COMMANDER_PATH & '\Profile\arc\7z64\temp1.txt')Autorun 2.2.21.3, TC 11.56 x32, Windows 11 23H2.Runtime error 216 at 06CC5EC0
Amo ergo sum
Не только у вас. Варианты что делать предлагались. Если у вас стоит TWinKey, попробуйте отключить. Скорее всего, он вызывает эту проблему.Mrak_Tlen писал(а):А только у меня закрывается тотал со скриптом нагскрин
Возможно, косяк Autorun, но для верности лучше посмотреть журнал приложений (сбойный модуль может оказаться другим). Реальный пример из моего журнала:yozhik писал(а):Runtime error 216 at 06CC5EC0
Код: Выделить всё
Имя сбойного приложения: TOTALCMD.EXE, версия: 11.55.0.0, метка времени: 0x2a425e19
Имя сбойного модуля: LineBreakInfo.wdx, версия: 0.3.0.0, метка времени: 0x6569ee66
Код исключения: 0xc0000005
Смещение ошибки: 0x0004a7c8-
FallenAngel
- Сообщения: 47
- Зарегистрирован: Вт дек 30, 2025 20:01
Дошли руки проверить. Проблема действительно есть.yozhik писал(а):При попытке удалить файл
Код: Выделить всё
Имя сбойного модуля: Autorun.wdx, версия: 2.2.21.3, метка времени: 0x68ef4c68Как вариант (если очень нужно) можно использовать ShellExec, пока автор плагина не объявится
Код: Выделить всё
Local tmp1 = COMMANDER_PATH & '\Ini\Backup\temp1.txt'
ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%tmp1%"""Код: Выделить всё
Local tmp1 = COMMANDER_PATH & '\Ini\Backup\temp1.txt'
If FileExist(tmp1) Then
ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%tmp1%"""
Endif Так не понятно было с чем бороться. Вы попробовали на другом компьютере, сказали, что всё то же самое, но пробовать нужно на другой сборке, где проблемы изначально не было замечено. Если на другой сборке проблемы нет, хотя бы будет понятно, что причину нужно искать в настройках своего ТС, а скорее всего в каком-то плагине, типа TWinKey.FallenAngel писал(а):Я не поборол и вернулся к autoclick.dll
Появился еще один интересный результат тестирования. Я у себя время цикла на 1 с исправил. Но тем не менее периодически окно висит несколько секунд. Поймать этот момент не возможно, соответственно время вычислить не возможно. Но у меня и время операций зависит от занятости ЦПУ.Orion9 писал(а):Так не понятно было с чем бороться.
Я уже собаку съел на таких прожкахMrak_Tlen писал(а):Закрыл пунтосвитчер. проблема пока ушла
[cut]
Извиняюсь за офтоп, но вместо панто свитчера предлагаю попробовать прожку Mahou. Сам ей пользуюсь и очень доволен. А про панто свитчер очень плохие вещи пишут. Не знаю, может сейчас они устранены.
[/cut]
Ну, о своем тестировании я тоже писал. Проблему воспроизвести мне не удалось, да и вообще проблем не заметил. Возможно, нужно больше тестов, но без повторения проблемы (закрытия тотала) остается только гадать, что может к этому приводить.AkulaBig писал(а):Появился еще один интересный результат тестирования
Не знаю на счет пунтосвитчера, но TWinKey, на мой взгляд, более опасен в плане конфликта. Он так же, как и Autorun, загружается в ТС в качестве псевдоконтентного плагина и перехвтывает нажатия клавиш.Mrak_Tlen писал(а):Закрыл пунтосвитчер. проблема пока ушла
Твинкей тоже есть.
Чтобы разобраться, что происходит, нужно для начала как-то локализировать проблему. Убедиться, что тотал не падает. А если падает, то какой плагин к этому приводит (посмотреть в журнале приложений). Проверить на других сборках. Проверить на чистом ТС. И так далее.
Ну а если не хочется этим заниматься, можно и к autoclick.dll вернуться )
Решение от AkulaBig рабочее, у меня этот код проблем не вызывает. Тем не менее, решил сделать альтернативный код, использующий другой алгоритм поиска кнопки.
Делал из интереса, поэтому некоторые моменты не учтены (например, работа с ключем в реестре), но разделение на блоки позволяет легко внести нужные изменения, если они потребуется.
Пример хорошо демонстрирует всю мощь и великолепие скриптового языка, которым стал современный Autorun. Тут вам и запуск в отдельном потоке, и чтение ключей из ini, и проверка существования файлов и каталогов, и раскрытие переменных окружения, и создание массивов, и выполнение операций в цикле, и работа со строками, и вызовы DllCall... Матерь божья!
Чувак сделал целый скриптовый движок!
[cut][/cut]
Что касается алгоритма, принцип примерно такой же. Каждые 50 миллисекунд после старта ТС происходит поиск окна триала. Если окно найдено, перечисляются все элементы управления через вызов EnumChildWindows. Далее сравнивается текст и класс каждого элемента, при совпадении посылается SendMessage.
Пример перечисления есть в справке (объект Callback), он был взят за основу.
Код можно вставить в любое место, но первый вызов "RunThread" должен обязательно идти после "LoadLibrary Plugins", поскольку используются дополнительные функции из модулей такие, как WinFind и ShowHint.
Если dbg = 1, то при запуске с удержанием CTRL отобразится отладочная информация в окне подсказки.
Возможно, запуск в отдельном потоке поможет избавится от конфликта с другими приложениями и плагинами, если таковой конфликт имелся.
Делал из интереса, поэтому некоторые моменты не учтены (например, работа с ключем в реестре), но разделение на блоки позволяет легко внести нужные изменения, если они потребуется.
Пример хорошо демонстрирует всю мощь и великолепие скриптового языка, которым стал современный Autorun. Тут вам и запуск в отдельном потоке, и чтение ключей из ini, и проверка существования файлов и каталогов, и раскрытие переменных окружения, и создание массивов, и выполнение операций в цикле, и работа со строками, и вызовы DllCall... Матерь божья!
[cut]
Код: Выделить всё
LoadLibrary Plugins\Autorun_Tweaks.dll
LoadLibrary Plugins\Autorun_Sysinfo.dll
LoadLibrary Plugins\Autorun_Runtime.dll
LoadLibrary Plugins\Autorun_Process.dll
LoadLibrary Plugins\Autorun_RegExp.dll
RunThread("NagScreen")
Func NagScreen()
Global gNagPush = 0, gNagCtrl = List()
If WincmdKeyExist() Then Return
Local ewp = Callback("EnumChilProc", "hwnd;lparam"), dbg = 1
Local hWnd, nTimeOut = 2000, nSleep = 0
While nTimeOut > 0
hWnd = WinFind(0, "TNASTYNAGSCREEN")
If hWnd > 0 Then
DllCall("EnumChildWindows", "hwnd", hWnd, "ptr", ewp.Ptr, "lparam", 0)
If gNagPush Then Break
EndIf
Sleep(50)
nTimeOut -= 50
Wend
If hWnd = 0 Then Return
If nSleep > 0 Then Sleep(nSleep)
If dbg And IsPressed(0x11) Then ShowHint(gNagCtrl.Text)
Free(gNagCtrl, ewp)
EndFunc
Func WincmdKeyExist()
Local lst = gNagCtrl
Local sKeyPath = IniRead("~/R", COMMANDER_INI, "Configuration", "KeyPath")
If sKeyPath = "$" Then Return 1
If sKeyPath <> "" Then
sKeyPath = JoinPath(Set(sKeyPath))
If FileExist(sKeyPath) Then lst.Add(sKeyPath)
EndIf
lst.Add(COMMANDER_PATH)
lst.Add(FileGetDir(COMMANDER_INI))
If FileExist("c:\totalcmd") Then lst.Add("c:\totalcmd")
For i = 0 To lst.Count - 1
If FileExist(lst[i] & "\wincmd.key") Then Return 1
If FileExist(lst[i] & "\tcmdkey.zip") Then Return 1
Next
Return 0
EndFunc
Func EnumChilProc(hwnd, lparam)
Local Text = WinGetText(hwnd)
gNagCtrl.Add(WinGetClass(hwnd) & " - " & Text)
If StrLen(Text) = 1 Then
gNagPush = Text
Return 1
EndIf
If StrLen(Text) = 2 Then
Text = StrReplace(Text, "&", "")
If Text = gNagPush Then
SendMessage(hwnd, 245, 0, 0)
Return 0
EndIf
EndIf
Return 1
EndFuncЧто касается алгоритма, принцип примерно такой же. Каждые 50 миллисекунд после старта ТС происходит поиск окна триала. Если окно найдено, перечисляются все элементы управления через вызов EnumChildWindows. Далее сравнивается текст и класс каждого элемента, при совпадении посылается SendMessage.
Пример перечисления есть в справке (объект Callback), он был взят за основу.
Код можно вставить в любое место, но первый вызов "RunThread" должен обязательно идти после "LoadLibrary Plugins", поскольку используются дополнительные функции из модулей такие, как WinFind и ShowHint.
Если dbg = 1, то при запуске с удержанием CTRL отобразится отладочная информация в окне подсказки.
Возможно, запуск в отдельном потоке поможет избавится от конфликта с другими приложениями и плагинами, если таковой конфликт имелся.
Зачем нам Панто Свитчер? Мы сделаем свой Панто Свитчер. Возможности Autorun не знают границAkulaBig писал(а):А вы установите Панто Свитчер
Небольшой патч к функционалу
[cut]
Код: Выделить всё
Func NagScreen()
Global gNagPush = 0, gNagCtrl = List()
If WincmdKeyExist() Then Return
Local ewp = Callback("EnumChilProc", "hwnd;lparam"), dbg = 1
Local hWnd, nTimeOut = 1500, nSleep = 0
While nTimeOut > 0
hWnd = WinFind(0, "TNASTYNAGSCREEN")
If hWnd > 0 Then
WinSetState(0, hWnd)
DllCall("EnumChildWindows", "hwnd", hWnd, "ptr", ewp.Ptr, "lparam", 0)
If gNagPush Then Break
EndIf
Sleep(50)
nTimeOut -= 50
Wend
If hWnd = 0 Then Return
If nSleep > 0 Then Sleep(nSleep)
If dbg And IsPressed(0x11) Then ShowHint(gNagCtrl.Text)
Free(gNagCtrl, ewp)
Sleep(500)
If WinGetState(1, hWnd) Then WinSetState(1, hWnd)
EndFunc WinSetState(0, hWnd) сразу скрывает окно при появлении. Эффект гладкости, как от бритья с тройным лезвием
Последние две строчки на всякий случай. Вдруг клик не сработает по какой-то причине, тогда окно снова нужно сделать видимым.