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 

Single Post  Topic: Autorun 
Author Message
Orion9



PostPosted: Mon Jun 23, 2025 13:59    Post subject: Reply with quote

Loopback wrote:
сейчас возвращается int, что не подходит для x64

Точно! Торопился, пропустил. Но хорошо, что это мелкая ошибка никак не связанная с плагином.

Теперь бы ещё вот с этим разобраться:
Code:
pNew = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_New", "Ptr")
Local hMI = DllCall(pNew, "Ptr")

Возможно на второй строчке ТСх64 падает.

Я еще попробовал сабклассинг подсказки сделать через SetClassLong, но что-то он не работает:
Code:
Local hTip = WinFind(0, "TToolTip")
g_WndProc = DllCall("SetClassLong" & (auX64 ? "PtrW" : "W"), _
                "hwnd", hTip, _
                "int", -24, _
                "long", oWP.Ptr, "ptr")
OutputDebugString("g_WndProc=" & g_WndProc & " oWP.Ptr=" & oWP.Ptr)

Вообще такое впечатление, что Гислер мониторит адрес оконной процедуры в классе и возвращает значение по умолчанию при его изменении. Хотя в этом я плохо разбираюсь, так что далеко идущих выводов делать, пожалуй, не стоит. Но если повесить на ControlSetHint /F /D:50 28
 Hidden text

То видно, как подсказка с прорисованной иконкой меняет позицию, а затем исчезает и заменяется новой дефолтной подсказкой. Странное какое-то поведение.

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

Я имею в виду, что после вызова SetClassLong, который вроде срабатывает:
Code:
Func ButtonBarTestHint()
    Local hTip = WinFind(0, "TToolTip")
    g_WndProc = DllCall("SetClassLong" & (auX64 ? "PtrW" : "W"), _
                    "hwnd", hTip, _
                    "int", -24, _
                    "long", oWP.Ptr, "ptr")

Нет входа в оконную процедуру TestWinProc:
Code:
Global g_WndProc
Global oWP = Callback("TestWinProc", "hwnd;uint;wparam;lparam")
                   
Func TestWinProc(hWnd, uMsg, wParam, lParam)
    Static WM_CLOSE = 0x0010
    OutputDebugString("Autorun: " & uMsg)
    If uMsg = WM_CLOSE Then
       If DllCall("DestroyWindow", "handle", hWnd) Then
          g_Task = 0
       EndIf   
       Return 0
    EndIf
    Return DllCall("CallWindowProcW", _
                   "ptr", g_WndProc, "hwnd", hWnd, "uint", uMsg, "wparam", wParam, "lparam", lParam)
EndFunc

С вызовом SetWindowLong это работает.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group