Orion9

|
Posted: Mon Jun 23, 2025 13:59 Post subject: |
|
|
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 Code: | Func ButtonBarTestHint()
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)
Local hDC = DllCall("GetWindowDC", "ptr", hTip, "ptr")
hIco = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0)
Local x, y, w, h
WinGetPos("x", "y", "w", "h", hTip)
DllCall("DrawIconEx", _
"ptr", hDC, _
"int", 10, _
"int", 10, _
"ptr", hIco, _
"int", 16, _
"int", 16, _
"uint", 0, _
"ptr", 0, _
"uint", 0x0003)
DllCall("ReleaseDC", "ptr", AUTORUN_TCHANDLE, "ptr", hDC)
WinSetPos(100, "", "", "", 1, hTip)
EndFunc
|
То видно, как подсказка с прорисованной иконкой меняет позицию, а затем исчезает и заменяется новой дефолтной подсказкой. Странное какое-то поведение.
Добавлено спустя 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 это работает. |
|