Страница 224 из 243

Добавлено: Сб мар 07, 2026 23:56
sa
Orion9 писал(а):WinSetState(0, hWnd) сразу скрывает окно при появлении.
А почему нельзя просто уменьшить задержку?
Sleep(1)
nTimeOut -= 1

Добавлено: Вс мар 08, 2026 12:21
Orion9
sa писал(а):А почему нельзя просто уменьшить задержку?
Можно. Но окно все-равно будет мелькать ) Проблема возникает не при обнаружении окна (WinFind находит его быстро), а в задержке SendMessage. Пока клик не дойдет и не обработается, окно будет висеть на экране, вызывая эффект мелькания. Но если его сразу скрыть после обнаружения, появится плавность как в рекламе Gillette Razor III :lol:

Неже обновленный код двух функций. Исправил мелкий косяк, который мог приводить к несрабатыванию клика при низком значении Sleep и высокой нагрузке на процессор. В дебаге добавлена информация о количестве итераций. Параметр nSleep стоит теперь на правильно месте. Если нужно затормозить окно триала, например, на секунду, то nSleep = 1000. Под спойлером разместил все три функции, чтобы не было путаницы.

[cut]

Код: Выделить всё

Func NagScreen()
    Global gNagPush = 0, gNagCtrl = List()
    If WincmdKeyExist() Then Return    
    Local ewp = Callback("EnumChilProc", "hwnd;lparam"), dbg = 1, i = 1
    Local hWnd, nTimeOut = 1500, nSleep = 0
    While nTimeOut > 0
        hWnd = WinFind(0, "TNASTYNAGSCREEN")
        If hWnd > 0 Then
           If nSleep > 0 Then Sleep(nSleep)            
           WinSetState(0, hWnd)
           DllCall("EnumChildWindows", "hwnd", hWnd, "ptr", ewp.Ptr, "lparam", 0)       
           If gNagPush = -1 Then Break
        EndIf
        Sleep(5)
        nTimeOut -= 5
        i += 1
    Wend       
    If hWnd = 0 Then Return
    If dbg And IsPressed(0x11) Then ShowHint("iter. = " & i & auCRLF & gNagCtrl.Text)
    Free(gNagCtrl, ewp)
    Sleep(500)
    If WinGetState(1, hWnd) Then WinSetState(1, hWnd)
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     
       If StrReplace(Text, "&", "") = gNagPush Then
          gNagPush = -1 
          SendMessage(hwnd, 245, 0, 0)
          Return 0
       EndIf
    EndIf   
    Return 1   
EndFunc
[/cut]

AkulaBig писал(а):Я против этого
Если речь о респектабельной задержке, то нужный параметр я добавил. На счет видюхи, не знаю. Очень сомнительно, что простое скрытие окна может привести к каким-то проблемам.

Добавлено: Вс мар 08, 2026 12:36
sa
Orion9 писал(а):Можно. Но окно все-равно будет мелькать
При значении Sleep(50) у меня оно мелькает и при WinSetState(0, hWnd).

Добавлено: Вс мар 08, 2026 13:16
AkulaBig
Orion9 писал(а):Очень сомнительно, что простое скрытие окна может привести к каким-то проблемам.
Исходников автокликеров нет. Поэтому гадать бесполезно. Факт что они все глючные.
Что-то в вашей сборке не работают хинты с exiftool. У вас они не подключены, но я подключил и получаю ошибку в строке 277 файла hints.cfg о недопустимом диапазоне.

Добавлено: Вс мар 08, 2026 18:11
Orion9
AkulaBig
Это отсюда:
Пример больше концептуальный, его еще нужно на практике проверять и доводить до рабочего состояния.
https://forum.wincmd.ru/viewpost.php?p=140472
В общем, это была только наработка, поэтому к конфигурации я ее и не стал подключать.

sa
Похоже, мелкая щетина остается :lol: Особенно это заметно, если процессор изрядно нагрузить.

Скорее всего ничего не поделать. Даже если поставить Break после WinSetState(0, hWnd) окно все-равно может мелькать. Что удивительно, в 64-битной версии все нормально, даже если проц полностью загрузить. Добавил еще переменную для дебага.
[cut]

Код: Выделить всё

Func NagScreen()
    Global gNagPush = 0, gNagCtrl = List()
    If WincmdKeyExist() Then Return
    Local ewp = Callback("EnumChilProc", "hwnd;lparam"), dbg = 1, i  = 1, h = 0
    Local hWnd, nTimeOut = 1500, nSleep = 0
    While nTimeOut > 0
        hWnd = WinFind(0, "TNASTYNAGSCREEN")
        If hWnd > 0 Then
           h += 1
           If nSleep > 0 Then Sleep(nSleep)            
           WinSetState(0, hWnd)
           #Break
           DllCall("EnumChildWindows", "hwnd", hWnd, "ptr", ewp.Ptr, "lparam", 0)
           If gNagPush = -1 Then Break
        EndIf
        Sleep(5)
        nTimeOut -= 5
        i += 1
    Wend
    If hWnd = 0 Then Return
    If dbg And IsPressed(0x11) Then 
       ShowHint("find = " & h & auCRLF & "round = " & i & auCRLF & gNagCtrl.Text)
    EndIf 
    Free(gNagCtrl, ewp)
    Sleep(500)
    If WinGetState(1, hWnd) Then WinSetState(1, hWnd)
EndFunc 
[/cut]
Сейчас используется Sleep(5), но Sleep(1) тоже не помогает. Просто происходит задержка, которая не зависит от Autorun. Код ведь не параллельно выполняется.

Добавлено: Вс мар 08, 2026 22:54
Orion9
Ну все, это последняя версия с оптимизацией EnumChilProc.

[cut]

Код: Выделить всё

LoadLibrary Plugins\Autorun_Tweaks.dll
LoadLibrary Plugins\Autorun_Runtime.dll

RunThread("NagScreen")

Func NagScreen()
    Global gNagPush = 0, gNagCtrl = List(), gNagDbg = false
    If WincmdKeyExist() Then Return
    Local ewp = Callback("EnumChilProc", "hwnd;lparam"), i = 1, h = 0
    Local hWnd, nTimeOut = 1500, nSleep = 0
    While nTimeOut > 0
        hWnd = WinFind(0, "TNASTYNAGSCREEN")
        If hWnd > 0 Then
           h += 1
           If nSleep > 0 Then Sleep(nSleep)            
           WinSetState(0, hWnd)
           DllCall("EnumChildWindows", "hwnd", hWnd, "ptr", ewp.Ptr, "lparam", 0)
           If gNagPush = -1 Then Break
        EndIf
        Sleep(5)
        nTimeOut -= 5
        i += 1
    Wend
    If hWnd = 0 Then Return
    If gNagDbg And IsPressed(0x11) Then 
       ShowHint("find = " & h & auCRLF & "round = " & i & auCRLF & gNagCtrl.Text)
    EndIf 
    Free(gNagCtrl, ewp)
    Sleep(500)
    If WinGetState(1, hWnd) Then WinSetState(1, hWnd)
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 sText = WinGetText(hwnd), nLen = StrLen(sText)
    If gNagDbg Then 
       gNagCtrl.Add(WinGetClass(hwnd) & " - " & sText)
    EndIf   
    If nLen = 1 Then
       gNagPush = "&" & sText
    ElseIf nLen = 2 And sText = gNagPush Then
       gNagPush = -1 
       SendMessage(hwnd, 245, 0, 0)
       Return 0
    EndIf
    Return 1   
EndFunc
[/cut]
Убраны лишние функции и отключен дебаг. Прибавку в скорости вряд ли получится заметить, но все же.

Добавлено: Пн мар 09, 2026 14:54
FallenAngel
Orion9 писал(а):Ну все, это последняя версия с оптимизацией EnumChilProc.
Похоже, работает стабильнее, чем у AkulaBig

По крайней мере
Mrak_Tlen писал(а):если после запуска первым делом нажать на любой пункт меню или правой кнопкой на панель табуляторов
этого уже нет.

Буду еще тестить.

UPD. Если СРАЗУ кликнуть ПКМ по табуляторам - закрывает ТС.

Добавлено: Пн мар 09, 2026 19:45
sa
FallenAngel писал(а):Если СРАЗУ кликнуть ПКМ по табуляторам - закрывает ТС.
А если закомментировать (или убрать) строку
# WinSetState(0, hWnd)
?

Добавлено: Пн мар 09, 2026 22:51
Orion9
FallenAngel писал(а):Если СРАЗУ кликнуть ПКМ по табуляторам - закрывает ТС.
Может и закрывает, но больше похоже, что ТС тупо падает из-за сбоя в каком-то плагине, необязательно Autorun.

А при клике по табуляторам должно отобразиться стандартное меню с колонками, или у вас что-то другое висит? Например, как писал Mrak_Tlen, кастомная сортировка плагина TWinKey.

Не знаю, что можно посоветовать на этом этапе. Попробуйте MsgBox для начала вставить в конец функции, чтобы убедиться, что она корректно отрабатывает до конца.

Код: Выделить всё

    Free(gNagCtrl, ewp)
    Sleep(500)
    If WinGetState(1, hWnd) Then WinSetState(1, hWnd)
    MsgBox("Exit")
EndFunc
Если окно не появляется, значит точно валится еще до него. Попробуйте поднять его выше по коду — рано или позно оно должно где-то появиться.

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

Можете закомментировать некоторые строки, как предлаает sa. Главное локализовать проблему. Если получится, то и решение возможно найдется.

Добавлено: Вт мар 10, 2026 10:13
FallenAngel
sa писал(а):# WinSetState(0, hWnd)
хм, вроде помогло!
Думаю, нужно хотя бы с недельку потестировать, чтоб наверняка.

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

Orion9
TWinKey не использую, но активно юзаю AHK2, он всегда запущен.

Добавлено: Вт мар 10, 2026 11:36
Orion9
FallenAngel писал(а):хм, вроде помогло!
Не понимаю, как это может влиять. Но если помогло, уже что-то.

Можете еще попробовать на этой мини-сборке ТС
https://wdfiles.ru/3wEuY
Здесь только Autorun и немного ваших скриптов. Повторяется проблема?

Добавлено: Вт мар 10, 2026 12:28
FallenAngel
Orion9 писал(а):Повторяется проблема?
Предварительно, нет.
Ну как минимум 5-6 запусков пробовал - падений не было.

Добавлено: Вт мар 10, 2026 12:52
AkulaBig
Orion9 писал(а):мини-сборке ТС
Вот больше всего что мне не нравится, вы и сделали. У вас окно так противно мелькает. Как в свое время ассоциации мелькали. Предлагаю либо сделать задержку, чтобы окно успевало появляться, либо добиться, чтобы оно совсем не появлялось.
Строка WinSetState(0, hWnd) у меня ни на что не влияет. Окно не скрывается. И очень забавно, если этот параметр может влиять на краш ТС. Чудес на свете не бывает.

Добавлено: Вт мар 10, 2026 12:56
sa
AkulaBig писал(а):Предлагаю либо сделать задержку, чтобы окно успевало появляться
Уже сделано: установите желаемое значение nSleep.

Добавлено: Вт мар 10, 2026 13:40
AkulaBig
sa писал(а):Уже сделано: установите желаемое значение nSleep.
Прикольно искусственно делать то, что может работать изначально.