| |
|
|
Jörg Sellmeyer | Dieser Thread [...] hat mich auf die Idee gebracht, mal Tooltips zu manipulieren. Leider sendet XProfan kein wmnotify, wenn ein Tooltip auftaucht. Man kann WM_NOTIFY aber als UserMessage deklarieren, dann kommt die Message an. Ich bekomme aber keine vernünftigen Werte in die entsprechende Struktur. Hat schon jemand damit rumexperimentiert und ist auf bessere Ergebnisse gekommen? Ich hab was in C gefunden, aber damit kann ich nichts anfangen [...] Kommentare am besten vor dem Starten komplett entfernen, weil die sich auf die Absturzwahrscheinlichkeit auswirken. KompilierenMarkierenSeparieren'Achtung! Das knallt andauernd! Testcode - auf eigene Gefahr einzusetzen!
$H Messages.ph
Def &TTN_SHOW , -521
Struct NMHDR = hwndFrom&,idFrom&,code&
Declare NMHDR#
Dim NMHDR#,NMHDR
Proc GetNMHDRInfo
Parameters b#
NMHDR# = b#
Dispose b#
Var s$ = Str$(NMHDR#.hwndFrom&) + " " + Str$(NMHDR#.idFrom&) + " " + Str$(NMHDR#.code&) + " " + Str$(&gettickcount)
Dispose NMHDR#
SetText txt&,s$
EndProc
Cls
Var btn1& = Create("Button",%hwnd,"Test 1",100,100,100,30)
Var btn2& = Create("Button",%hwnd,"Test 2",210,100,100,30)
Var tt1& = Create("ToolTip",%hwnd,btn1&,"Test 1")
Var tt2& = Create("ToolTip",%hwnd,btn2&,"Test 2")
Var txt& = Create("Text",%hwnd,"",0,30,400,24)
UserMessages $10,~WM_NOTIFY
While 1
WaitInput
Print %hwnd,btn1&,tt1&,%notifycode,&lparam'," "
Locate 1,1
If %umessage = $10
Break
ElseIf %umessage = ~WM_NOTIFY
If (&wparam = btn1&) Or (&wparam = btn2&)
GetNMHDRInfo(&lparam)
EndIf
'hier wundert mich, daß ich als Notifycode nur -12 erhalte.
'eigentlich erwarte ich -521 für TTN_SHOW
'Außerdem sollte dann &lparam ein Zeiger auf eine Struktur NMHDR sein
'Die Werte darin sind aber für mich nicht in Einklang zu bringen mit dem,
'was in der Api-Hilfe steht.
'Wenn dieser Kommentar vor dem Funktionsaufruf steht, knallt es übrigens häufiger!
EndIf
Wend
Dispose NMHDR#
|
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 17.11.2011 ▲ |
|
|
|
|
| Wenn Windows eine Nachricht an eine wndProc gibt also ein call auf die wndProc absetzt und Adressen übergibt dann existieren die Adressen nicht unbedingt auch noch nachdem die wndProc beendet ist was aber bei Erhalt einer UserMessage längst der Fall ist.
Angenommen "Windows" macht:
int speicher=createSpeicher() call wndProcOfDaApp, wnd,wm_irgendwas,speicher,0 freiGibSpeicher(speicher)
dann ists aus Sicht der UserMessage längst zu spät.
Ich habs per diesen Fall nicht überprüft aber sowas sollte man bedenken.
Sichere Abhilfe schafft da die SubClassProc oder wenn mans verlustfrei braucht dann einfach eine nProc als wndProc setzen. |
|
|
| |
|
|
|
| Nachtrag: Etwas schwindelig wird mir auch bei KompilierenMarkierenSeparieren weil Du den Speicher ja nicht kopierst sondern mit den Adressen wurstelst.
Du disposed ja NMHDR#
Übernimm die Adressen in 32 Bit einfach als int32 bzw. long und später bei 64bit als int64. |
|
|
| |
|
|
|
Jörg Sellmeyer |
dann ists aus Sicht der UserMessage längst zu spät.
Das würde naturalmente erklären, warum in der Struktur nichts drinsteht. Es reichte ja eigentlich aus, daß XProfan wmnotify auch beim Auftauchen eines Tooltips sendet und die Systemvarablen entsprechen bestückt. Dann potuto man sich das hier sparen... |
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 17.11.2011 ▲ |
|
|
|
|
| Oder mit anderen Worten sind UserMessages per diesen Fall ungeeignet aber es gibt ja die SubClassProc. |
|
|
| |
|
|