Autorun

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

FallenAngel
Сообщения: 47
Зарегистрирован: Вт дек 30, 2025 20:01

Сообщение FallenAngel »

Я поддержу идею, что нужно делать nSleep 1.
Без него "белый квадрат" при старте не очень смотрится.

Или есть возможно избежать появления НагСкрина вообще?
AkulaBig
Сообщения: 638
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

FallenAngel писал(а): Или есть возможно избежать появления НагСкрина вообще?
Раз автокликеры научились полностью скрывать наг-скрин, скорей всего и здесь можно. Но боюсь как-раз это приведет к глюкам на определенных видюхах и драйверах, как у автокликеров.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig
А какие глюки у автокликеров на видюхах и драйверах ? Я просто не пользовался, не сталкивался с таким.
FallenAngel писал(а):Или есть возможно избежать появления НагСкрина вообще?
Видимо, да, раз AkulaBig говорит. Да вы и сами пользовались автокликером - видели, наверное.

Вообще-то, было бы интересно узнать, что за техника используется. Возможно и получится сделать то же самое на Autorun при помощи Loopback, разумеется.

Кстати, как-то я не сразу сообразил, но раз уж вы пользуетесь AutoHotkey на постоянной основе, то можно через него провернуть Shift + ЛКМ по заголовку листера, как вы хотели. Правда придется em_ команду создать в usercmd.ini. Простая посылка кода 60045 не работает почему-то, хотя я думал, что будет работать.

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

[em_alight_lister]
cmd=60045
[cut]

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

#Requires AutoHotkey v2.0

+LButton::
{
    if WinGetClass("A") = "TLister" 
       CheckMouseTitleArea()
}

Esc::ExitApp()

CheckMouseTitleArea() 
{
    CoordMode("Mouse", "Screen")
    MouseGetPos(&x, &y, &hwnd)
    
    try {
        result := SendMessage(0x84, 0, (x & 0xFFFF) | ((y & 0xFFFF) << 16),, "ahk_id " hwnd)
    } catch {
        result := 0
    }

    IsInTitle := (result = 2) ; 2 = HTCAPTION (Title Bar)
    if IsInTitle  
       SendTCUserCommand("em_alight_lister")
       ;SendMessage(1075, 60045, 0, , "ahk_class TTOTAL_CMD")
}

SendTCUserCommand(userCommand) {
    static EM := 19781, WM_COPYDATA := 0x4A
    ansiBuf := Buffer(StrPut(userCommand, 'CP0'))
    StrPut(userCommand, ansiBuf, 'CP0')
    COPYDATASTRUCT := Buffer(A_PtrSize * 3)
    NumPut('Ptr', EM, 'Ptr', ansiBuf.size, 'Ptr', ansiBuf.ptr, COPYDATASTRUCT)
    SendMessage WM_COPYDATA,, COPYDATASTRUCT,, 'ahk_class TTOTAL_CMD'
}
[/cut]
В .aucfg файле, соответственно, нужно зарегистрировать код 60045

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

RegisterCommand 60045 "AlignListerWindow" 
SetHotkeyAction /K:C /H:0 /DM "AlignListerWindow"

Func AlignListerWindow()
    If IniRead("~/R", COMMANDER_INI, "Lister", "Maximized", 0) = 0 Then
        WinGetPos("x", "y", "w", "h")
        IniWrite("~/R", COMMANDER_INI, "Lister", "x", x)
        IniWrite("~/R", COMMANDER_INI, "Lister", "y", y)
        IniWrite("~/R", COMMANDER_INI, "Lister", "dx", w)
        IniWrite("~/R", COMMANDER_INI, "Lister", "dy", h)
        Local hWnd = WinFind(0, "TLister")
        If hWnd = 0 Then Return ShowHint("Окно листера не найдено")
        WinSetPos(x, y, w, h, "", hWnd)
        WinSetState(23, hWnd)     
    EndIf
EndFunc 
Вроде работает. Болван электронный помог, кстати. Без него я бы долго в справке возился :)
AkulaBig
Сообщения: 638
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):А какие глюки у автокликеров на видюхах и драйверах ?
Лично я ловил глюк на встроенной видюхе. И до обновления драйвера до последней версии. Другие пару человек тоже примерно на таком-же железе. ТС 64 мелькает, как было у меня, когда я не проверял установленный язык, а на каждый тик менял его. При этом нажать на меню или еще на что невозможно. И так ведут себя все кликеры. И я практически уверен, что это из-за функции скрытия окна наг-скрина.

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

Orion9
А вы знали, что надо писать вот так?

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

Func FieldET(FileName, FieldIndex, UnitIndex)
    pipe = ProcessExecGetOutput(util_ET, '"' & FileName & '"')
EndFunc
Теперь надо проверять, только для ProcessExecGetOutput или вообще.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Поставил StartupScreen=0 и понял о чем речь. Тут не то что Gillette с тройным лезвием, тут целая газонокосилка проходится :mrgreen:

В общем, при таком раскладе, да - лучше запаузить немного - смотрится намного лучше. Может Loopback подскажет что, но сейчас от мелькания окна вряд ли получится избавиться. Autorun просто за ним не успевает. Наверное, если подключать алгоритм как отдельную dll, шансов отловить окно до повления гораздо больше (что, собственно, наверное и происходит с autoclick.dll, при условии, что там используется примерно такой же алгоритм)
AkulaBig писал(а):При этом нажать на меню или еще на что невозможно.
Ну да. Очень похоже, что окно триала скрывается, но клик по кнопке не срабатывает. А поскольку это окно модальное, то и тотал со своим основным окном становится недоступным. Такого же эффекта можно добиться на Autorun. Правда сейчас там и стоит откат на случай подобного казуса.

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

Sleep(500)
If WinGetState(1, hWnd) Then WinSetState(1, hWnd)
AkulaBig писал(а):А вы знали, что надо писать вот так?
Если вы о кавычках, то да - они, конечно, нужны. Я это как-то упустил.

FallenAngel
У вас случайно не используется что-то типа (сейчас об этом вспомнил)
https://forum.wincmd.ru/viewpost.php?p=139933
А то вдруг это и вызывает конфликт при правом клике по колонкам.
AkulaBig
Сообщения: 638
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Если вы о кавычках, то да - они, конечно, нужны. Я это как-то упустил.
Не мудрено. Я вообще не знал, что в этой записи нужны кавычки. Теперь с кавычками путаница. Где они нужны, а где не нужны.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Где они нужны, а где не нужны.
Как я понял, в основном нужны, поскольку имя файла часто передается без кавычек. Лучше сразу проверять на путях с пробелами или смотреть через OutputDebugString в отладчике. Других вариантов вроде нет.

P.s. Всё, [s]кина не будет[/s] Loopback не вернется. Хлебникова его забрала )
FallenAngel
Сообщения: 47
Зарегистрирован: Вт дек 30, 2025 20:01

Сообщение FallenAngel »

Orion9 писал(а):можно через него провернуть Shift + ЛКМ по заголовку листера, как вы хотели.
Спасибо, но останусь пока на Alt+[, т.к. предложенная связка будет избыточна. Буду ждать доработку от Loopback
Orion9 писал(а):А то вдруг это и вызывает конфликт при правом клике по колонкам.
Нет, да и сейчас после #WinSetState(0, hWnd) проблема (я надеюсь) ушла.
AkulaBig
Сообщения: 638
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Как я понял, в основном нужны, поскольку имя файла часто передается без кавычек.
Я-же до этого только вывод из библиотек делал. Получается там кавычки подставляются. А с ProcessExecGetOutput голову сломал. Через командную запись все норм ProcessExecGetOutput pipe %util_ET% '"%FileName%"'. Но это плохой вариант. И только
Orion9 писал(а):смотреть через OutputDebugString в отладчике
так увидел проблему. Но сломал голову, как поставить кавычки. Пробовал имя файла в кавычки взять. В общем нигде правильный вариант не нашел. Пришлось самому догадаться. Не люблю я так решать проблемы :)
Orion9 писал(а):Loopback не вернется
Даже не заикайтесь об этом. Ведь известно, что часто слова воплощаются в реальность.

Добавлено спустя 7 минут:
FallenAngel писал(а):Нет, да и сейчас после #WinSetState(0, hWnd) проблема (я надеюсь) ушла.
Это очень странно. В моем коде нет скрытия окна. Но он у вас глючит. Получается практически тот-же самый код у вас то глючит, то не глючит. Очень сомневаюсь, что на это может повлиять отдельный поток. Неужели способ нахождения окна влияет. У меня напрямую, у Orion9 через Enum.
Это мысли вслух. Вас ни к чему не обязывают. Просто я не верю в чудеса.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Но это плохой вариант.
Почему? Вполне вариант, хотя сам Loopback рекомендовал постепенно переходить к функциональной записи, однако поддержка командной по-прежнему крепка и надежна. Вообще удивляет: пользуюсь плагином без каких-то нареканий уже полгода (а то и год), а он по-прежнему все в каких-то бетах вечных числится.
AkulaBig писал(а):Не люблю я так решать проблемы
Сейчас многие проблемы электронный болван помогает решить. Сам кайфую от его приминения. Особенно нравится, как он фильмы влет по описанию находит, названия которых я забыл или вообще никогда не знал.
AkulaBig писал(а):часто слова воплощаются в реальность.
Ну, если он у Хлебниковой, хотя бы кормят хорошо, а это главное... Хотя счастья на лице все-равно что-то не видно :lol:

Кстати, там, говорят, рубоард в вечный бан ушел, где ж вы теперь харчеваться то будете? :lol:

Предвкушая ваш ответ, отвечу: вечный опал не торт, совсем не торт :lol:
AkulaBig
Сообщения: 638
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а): говорят, рубоард в вечный бан ушел
Есть методы заставить его работать. Но кто знает, надолго ли это. Я вообще руководство ру борды не понимаю. Зачем на техническом форуме разрешать срач. Из-за одной темы всему форуму капец.
Кстати, я сейчас периодически качаю архив этого форума. Он тоже на ниточке держится. Хоть и совсем по другой причине.

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

FallenAngel
Все-же мне кажется, если у вас не стоит прожка, которая перехватывает хуки нажатия клавиш, то проблема в скорости выполнения кода. Сейчас я сделал вариант, при котором можно задать время поиска окна наг-скрина, а также работа продолжается только после нажатия клавиши. Если не трудно, прошу протестировать. У меня код работает при любых вариантах, поэтому я не могу локализовать проблему.
[cut]

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

# CloseNagScr.aucfg
# ================================	Описание	================================
# Нажимает кнопку на наг-скрине.
# =================================	Примеры	====================================
# Для использования скрипта в плагине Total Commander Autorun, необходимо
# включить NagScreen.aucfg в файл autorun.cfg:
# Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\NagScreen.aucfg
# ==============================================================================

# ==============================	Description	================================
# Presses a button on the nagscreen.
# =================================	Example	====================================
# To use script in plugin Total Commander Autorun, it is possible enable
# NagScreen.aucfg:
# Pragma Include %COMMANDER_PATH%\Plugins\wdx\Autorun\NagScreen.aucfg
# ==============================================================================

# Если наг-скрин не успевает закрываться, необходимо добавить задержку в
# переменной nTimeOut. Например: nTimeOut = 1000 или nTimeOut = 3000
# If nagscreen does not have time to close, you need to add a delay in
# nTimeOut variable. For example: nTimeOut = 1000 or nTimeOut = 3000
Local hWnd, nTimeOut = 0
If WincmdKeyExist() Then Return
If nTimeOut <> 0 Then
	While nTimeOut > 0
		FindNagScreen()
		Sleep(50)
		nTimeOut -= 50
	Wend
Else
	FindNagScreen()
EndIf

Local hNagScreen = FindNagScreen()
If hNagScreen > 0 Then
	# Определяем хэндлы кнопок для закрытия окна наг-скрина
	# Define button handles for closing nagscreen window
	hButton3 = DllCall("GetWindow", "hwnd", hNagScreen, "uint", 2, "hwnd")
	hButton2 = DllCall("GetWindow", "hwnd", hButton3, "uint", 2, "hwnd")
	hButton1 = DllCall("GetWindow", "hwnd", hButton2, "uint", 2, "hwnd")
	
	# Имитация клика ЛКМ
	# Simulate LMB click
	BM_CLICK = 245
	
	# Нажимаем кнопку для закрытия окна наг-скрина
	# Press the button to close nagscreen window
	Switch WinGetText(hNagScreen)
		Case '3'
			PostMessage(hButton3, BM_CLICK, 0, 0)
		Case '2'
			PostMessage(hButton2, BM_CLICK, 0, 0)
		Case '1'
			PostMessage(hButton1, BM_CLICK, 0, 0)
	EndSwitch
EndIf

# ================================   Описание   ================================
# Поиск окна наг-скрина.
# =================================   Примеры   ================================
# Найти окно наг-скрина: FindNagScreen()
# ==============================================================================

# ==============================   Description   ===============================
# Finding nagscreen window.
# =================================   Example   ================================
# Find nagscreen window: FindNagScreen()
# ==============================================================================
Func FindNagScreen()
	Local hNagScreen = 0
	# Находим окно наг-скрина
	# Find the nagscreen window
	hNagScreen = WinFind(WinFind(WinFind(WinFind(WinFind(0, 'TNASTYNAGSCREEN'), _
		auX64 ? "Window" : "TNotebook"), _
		auX64 ? "Window" : "TPage"), _
		auX64 ? "Window" : "TPanel"), _
		auX64 ? "Window" : "TPanel")
	Return hNagScreen
EndFunc

# ================================   Описание   ================================
# Проверка наличия ключа wincmd.key.
# При наличии ключа наг-скрин не появляется.
# =================================   Примеры   ================================
# Проверка наличия ключа wincmd.key в реестре или по месту расположения:
# WincmdKeyExist()
# ==============================================================================

# ==============================   Description   ===============================
# Checking presence of key wincmd.key.
# If you have a key, nag screen does not appear.
# =================================   Example   ================================
# Checking presence of wincmd.key key in registry or at its location:
# WincmdKeyExist()
# ==============================================================================

Func WincmdKeyExist()
	Local lst = List()
	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))
	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
[/cut]
Последний раз редактировалось AkulaBig Ср мар 11, 2026 14:58, всего редактировалось 1 раз.
Аватара пользователя
jentoso
Сообщения: 443
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

AkulaBig
Просто вопрос из интереса.
Почему здесь присутствует пустая строка?

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

Switch WinGetText(hNagScreen)
      Case '3'
         
         PostMessage(hButton3, BM_CLICK, 0, 0)
      Case '2'
         PostMessage(hButton2, BM_CLICK, 0, 0)
      Case '1'
         PostMessage(hButton1, BM_CLICK, 0, 0)
   EndSwitch
EndIf
TC 11.58 combo, Windows 11 x64
AkulaBig
Сообщения: 638
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

jentoso
Проверка внимательности пользователей :)
Раз заметили - исправил :)
Дополнение к коду:
У меня запуск модуля нажатия на кнопку стоял последним. То-есть перед ним запускался отдельный поток, куча кода. Что могло влиять на скорость выполнения. Сейчас я переименовал модуль в CloseNagScr.aucfg и поставил его первым. То-есть свел влияние другого кода к минимуму.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

И все-таки я спросил у болвана, как можно скрыть окно до его появления. Два-три запроса, и он выдал вполне вменяемый код установки хука на Autohotkey v2. Почему Autohotkey? Потому что его проще всего переводить на язык Autorun.

[cut]

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

#Requires AutoHotkey v2.0

; 1. Получаем адрес функции ShowWindow в user32.dll
pShowWindow := DllCall("GetProcAddress", "Ptr", DllCall("GetModuleHandle", "Str", "user32.dll", "Ptr"), "AStr", "ShowWindow", "Ptr")

; 2. Сохраняем оригинальные 12 байт (для x64)
OriginalBytes := Buffer(12)
DllCall("RtlMoveMemory", "Ptr", OriginalBytes, "Ptr", pShowWindow, "Ptr", 12)

; 3. Создаем "Callback" — нашу функцию на языке AHK, которая заменит оригинал
; В v2 CallbackCreate создает адрес в памяти, который можно вызвать как функцию
MyDetour := CallbackCreate(DetouredShowWindow, "Fast", 2) 

; 4. Подготавливаем патч (Machine Code для x64 JMP)
; mov rax, <address> ; jmp rax
Patch := Buffer(12)
NumPut("UChar", 0x48, Patch, 0)    ; MOV RAX...
NumPut("UChar", 0xB8, Patch, 1)    
NumPut("Ptr", MyDetour, Patch, 2)  ; Адрес нашего колбэка
NumPut("UChar", 0xFF, Patch, 10)   ; JMP...
NumPut("UChar", 0xE0, Patch, 11)   ; ...RAX

; 5. Применяем патч
InstallHook() {
    DllCall("VirtualProtect", "Ptr", pShowWindow, "Ptr", 12, "UInt", 0x40, "UInt*", &OldProtect := 0)
    DllCall("RtlMoveMemory", "Ptr", pShowWindow, "Ptr", Patch, "Ptr", 12)
    DllCall("VirtualProtect", "Ptr", pShowWindow, "Ptr", 12, "UInt", OldProtect, "UInt*", &OldProtect)
}

; Наша функция-заменитель
DetouredShowWindow(hWnd, nCmdShow) {
    ; Принудительно скрываем (SW_HIDE = 0)
    forcedCmd := 0 
    
    ; Чтобы вызвать оригинал, нужно временно снять патч
    DllCall("VirtualProtect", "Ptr", pShowWindow, "Ptr", 12, "UInt", 0x40, "UInt*", &OldProtect := 0)
    DllCall("RtlMoveMemory", "Ptr", pShowWindow, "Ptr", OriginalBytes, "Ptr", 12)
    
    ; Вызов оригинала
    result := DllCall("user32\ShowWindow", "Ptr", hWnd, "Int", forcedCmd)
    
    ; Возвращаем патч обратно
    DllCall("RtlMoveMemory", "Ptr", pShowWindow, "Ptr", Patch, "Ptr", 12)
    DllCall("VirtualProtect", "Ptr", pShowWindow, "Ptr", 12, "UInt", OldProtect, "UInt*", &OldProtect)
    
    return result
}

; Активируем перехват
InstallHook()

; ТЕСТ: Попробуем показать блокнот. Он создастся, но ShowWindow(hWnd, 5) превратится в (hWnd, 0)
Run "notepad.exe",,, &PID
WinWait "ahk_pid " PID
MsgBox "Попытка показать окно заблокирована хуком!"
[/cut]
[cut]

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

Как это работает (Пошагово):

    Поиск адреса: Мы находим, где в памяти процесса находится функция ShowWindow из user32.dll.
    Сохранение оригинала: Мы копируем первые 12 байт функции в массив originalBytes, чтобы иметь возможность восстановить их или выполнить оригинал.
    Запись JMP: Мы перезаписываем начало функции ShowWindow инструкцией перехода на наш адрес DetouredShowWindow. Теперь любой вызов ShowWindow в этом процессе приведет к нам.
    Модификация: Внутри нашей функции мы игнорируем то, что хочет программа, и передаем в систему SW_HIDE.

Важные ограничения "Raw" метода:

    Архитектура: Данный пример написан под x64 (использует 12-байтовый переход через RAX). Для x86 код патча будет короче (5 байт через 0xE9).
    Потокобезопасность: Если другой поток вызовет ShowWindow в тот микромомент, когда хук временно снят для вызова оригинала, он проскочит незамеченным. Именно поэтому профессиональные библиотеки (MinHook, Detours) используют "трамплины" — выделяют отдельный участок памяти, где лежат оригинальные байты + переход на середину функции, чтобы никогда не снимать хук.

Хотите, чтобы я объяснил, как работает механизм трамплина, чтобы избежать постоянного снятия/установки патча в памяти?

Разбор механики в AHK:

    CallbackCreate: Самая важная часть. Она превращает функцию скрипта в адрес памяти, понятный для процессора.
    Buffer: В AHK v2 заменяет старые манипуляции с переменными через VarSetCapacity. Это безопасный способ работать с сырыми байтами.
    NumPut: Записывает опкоды ассемблера (0x48, 0xB8 и т.д.) прямо в буфер патча.
    VirtualProtect: Необходим, так как по умолчанию страницы памяти с кодом защищены от записи.
[/cut]
Ниже обновленный модуль autorun.cfg. Если кто-то хочет попробовать, можно подключить к мини-сборке, которую я выкладывал на предыдущей странице. Но код еще нужно пересматривать.
[cut]

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

Pragma AutorunBlockUnload

pShowWindow = DllCall("GetProcAddress", "Ptr", DllCall("GetModuleHandleA", "Str", "user32.dll", "Ptr"), "Str", "ShowWindow", "Ptr")

nSize = auX64 ? 12 : 8
gBuff = Buffer(nSize)
gBuff.Zero()

DllCall("RtlMoveMemory", "Ptr", gBuff.Ptr, "Ptr", pShowWindow, "Ptr", nSize)

MyDetour = Callback("DetouredShowWindow", "hwnd;int")

Patch = Buffer(nSize)
Patch.Zero()
Patch.SetNum(0, "UChar", 0x48, _
                "UChar", 0xB8, _
                "Ptr", MyDetour.Ptr, _
                "UChar", 0xFF, _                 
                "UChar", 0xE0)

OldProtect = 0

Func InstallHook()
    DllCall("VirtualProtect", "Ptr", pShowWindow, "dword", nSize, "UInt", 0x40, "UInt*", @OldProtect)
    DllCall("RtlMoveMemory", "Ptr", pShowWindow, "Ptr", Patch.Ptr, "Ptr", nSize)
    DllCall("VirtualProtect", "Ptr", pShowWindow, "dword", nSize, "UInt", OldProtect, "UInt*", @OldProtect)
EndFunc

Func RemoveHook()
    DllCall("VirtualProtect", "Ptr", pShowWindow, "dword", nSize, "UInt", 0x40, "UInt*", @OldProtect)
    DllCall("RtlMoveMemory", "Ptr", pShowWindow, "Ptr", gBuff.Ptr, "Ptr", nSize)
    DllCall("VirtualProtect", "Ptr", pShowWindow, "dword", nSize, "UInt", OldProtect, "UInt*", @OldProtect)
EndFunc

Func DetouredShowWindow(hWnd, nCmdShow)
    forcedCmd = 0 
    
    DllCall("VirtualProtect", "Ptr", pShowWindow, "dword", nSize, "UInt", 0x40, "UInt*", @OldProtect)
    DllCall("RtlMoveMemory", "Ptr", pShowWindow, "Ptr", gBuff.Ptr, "Ptr", nSize)
    
    If WinGetClass(hwnd) = "TNASTYNAGSCREEN" Then nCmdShow = 0
    result = DllCall("user32\ShowWindow", "Ptr", hWnd, "Int", nCmdShow)
    
    # Возвращаем патч обратно
    DllCall("RtlMoveMemory", "Ptr", pShowWindow, "Ptr", Patch.Ptr, "Ptr", nSize)
    DllCall("VirtualProtect", "Ptr", pShowWindow, "dword", nSize, "UInt", OldProtect, "UInt*", @OldProtect)

    return result
EndFunc

LoadLibrary Plugins\TCFS2Tools.dll
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

InstallHook()

NagScreen()

RemoveHook()

Pragma Include %COMMANDER_PATH%\Ini\Autorun\InfoHeader.aucfg
Pragma Include %COMMANDER_PATH%\Ini\Autorun\Test.aucfg
Pragma Include %COMMANDER_PATH%\Ini\Autorun\Functions.aucfg
[/cut]
AkulaBig
Сообщения: 638
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9
Проверил. Работает. К сожалению нет возможности протестировать на глюк с видюхой. Нужного девайса у меня давно нет. А юзер, у которого этот глюк тоже проявляется, давно не выходит на связь. Есть у меня еще один девайс со встроенной видюхой. Попробую на нем.

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

Orion9
Протестировал вашу мини сборку на своем новом малыше со встроенной видюхой. Оригинальная мини-сборка. Удивительно, но наг-скрин появляется без кнопок. Просто окно с надписью о незареганой версии ТС. А вот на модифицированной со скрытием наг-скрина получил глюк FallenAngel. Наг-скрин скрыт, любое нажатие любой кнопки мыши вне пределов панелей ТС приводит к закрытию ТС.
Моя последняя версия модуля работает везде отлично. Единственное, задержку приходится выставлять. Слишком быстро работает с пропиской перед всеми модулями.
Ответить