Kontakt
DSVGO
Private Declare Function SetWindowLongA Lib "user32" ( _ ByVal hWnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As LongDie Paramter sind folgendermaßen zu lesen:
hWnd
enthält das sogenannte Windows-Handle des auszuspionierenden Windows-Objekts (eine Windows-interne "Hausnummer"). nIndex
wird in unserem Fall immer GWL_WNDPROC (was -4 entspricht) sein, was bedeutet, daß wir die Adresse der sogenannten Windows-Prozedur (sprich: "Nachrichtenleitung") setzen wollen. dwNewLong
schließlich wird die Adresse unserer VB-Funktion enthalten. Als Rückgabewert liefert die API-Funktion übrigens die Adresse des bisherigen Nachrichten-Empfängers, was sehr wichtig ist, um die nicht zu modifizierenden Nachrichten an den ursprünglichen Empfänger weiterleiten zu können. Ansonsten darf man sich mal wieder über die eine oder andere "Allgemeine Schutzverletzung" freuen. Private Declare Function CallWindowProcA Lib "user32" ( _ ByVal lpPrevWndFunc As Long, _ ByVal hWnd As Long, _ ByVal Msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As LongDie Parameter sind hier folgendermaßen zu lesen:
lpPrevWndFunc
bestimmt die Adresse des ursprünglichen Empfängers. hWnd
enthält wieder das Windows-Handle. Msg
bestimmt den Messagetyp (also WM_MOVE, WM_SIZING, etc. pp.). wParam
und lParam
enthalten - je nach Messagetyp - eventuell noch Parameter (z.B. die Koordinaten, wo sich gerade die Maus befindet, o.ä.). Public Function TestWndProc( _ ByVal hWnd As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long 'Nachricht "analysieren": If uMsg = WM_SIZING Then Beep '... 'Nachricht weiterleiten: TestWndProc = CallWindowProcA(VorigeAddr, hWnd, _ uMsg, wParam, lParam) End FunctionMan beachte die letzte Anweisung in der Funktion: Hier wird die Nachricht an den ursprünglichen Empfänger delegiert.
AddressOf
, mit der man gerade dies machen kann. Leider funktioniert dies jedoch nur bei Funktionen, welche in einem BAS-Modul definiert worden sind. Außerdem kann dieser Operator nur als Parameter innerhalb eines Funktionsaufrufs benutzt werden. Also funktioniert keine der folgende Anweisungen:Var = AddressOf TestWndProc Var = AddressOf(TestWndProc)Man muß stattdessen eine Dummy-Funktion benutzen, um die Adresse einer VB-Funktion in einer Variablen anlegen zu können:
Private Function Addr2Long(ByVal Addr As Long) As Long Addr2Long = Addr End Function 'Aufruf: Var = Addr2Long(AddressOf TestWndProc)Und schon können wir jederzeit auf die Adresse unserer VB-Funktion zugreifen!
© Jost Schwider, 29.04.2000-30.04.2000 - http://vb-tec.de/subclas2.htm