Klasse: Subclassing
von Konrad Rudolph
Subclassing
Diese Klasse kapselt auf komfortable Weise ein Subclassingmodul. Auf diese Weise kann man als Programmierer mit allem OO-Komfort Subclassing nutzen. Besonders daran ist zusätzlich, daß die Klasse durch einige kleine Tricks fast crashsicher gemacht wurde, d.h. man kann seine Projekte ganz gewohnt debuggen und auch mit F8 Schritt für Schritt durchgehen, ohne daß es knallt (außer an einer einzigen Stelle). Trotzdem bleibt zu beachten, daß das Projekt sauber entladen wird und nicht über die "Stop"-Schaltfläche der IDE, da das trotzdem zu einem Crash führt.
Pro gesubclasstes Control kann man beliebig viele Messages hooken und pro Anwendung kann man beliebig viele Controls subclassen, allerdings braucht man für jedes Control eine neue Instanz der CHook-Klasse.
Das beigefügte Beispiel erklärt die Funktionsweise anhand zweier gehookter Messages:
WM_LBUTTONUP ist ein Äquivalent des Click()-Ereignisses während WM_GETMINMAXINFO nicht mit VB-Bordmitteln nachzuprogrammieren ist. Es reagiert auf Größenveränderungen der Form und legt eine minimale Größe fest.
Im Folgenden sind die Funktionen und Events der Klasse in Kürze erklärt.
- Sub CreateHook(hWnd As hWnd, uMsg As WM_CONST)
erstellt einen neuen Hook.
Parameter:
* hWnd As hWnd: der Handle zu dem zu subclassenden Fenster (also auch Control)
* uMsg As WM_CONST: zu hookende Message. WM_CONST ist ein Enum, der alle Windows Messages enthält - Sub DestroyHook()
löscht den Hook - RemoveMsg(uMsg As WM_CONST)
entfernt eine zu hookende Nachricht
Parameter:
* uMsg As WM_CONST: Nachricht, die nicht mehr gehookt werden soll - Event Before(ByRef uMsg As WM_CONST, ByRef wParam As Long, ByRef lParam As Long)
wird aufgerufen, bevor die Nachricht zur Bearbeitung an die fenstereigene Windowproc weitergeleitet wird.
Parameter:
* uMsg As WM_CONST: Nachricht, die aufgerufen wurde
* wParam As Long: wParam. Siehe in der MSDN für Details
* lParam As Long: lParam. Siehe in der MSDN für Details
wenn man (wie z.B. bei WM_GETMINMAXINFO) Änderungen an den Parametern vornimmt, muß uMsg auf Null gesetzt werden, damit das Modul weiß, daß die Nachricht bereits verarbeitet wurde und nicht mehr an die fenstereigene Windowproc weitergeleitet werden soll. - Event After(ByRef uMsg As WM_CONST, ByRef wParam As Long, ByRef lParam As Long)
wird aufgerufen, nachdem die Nachricht abgearbeitet wurde.
Im Wesentlichen gilt das selbe wie für Before(), nur daß man hier die Nachrichten nicht mehr unterbrechen kann; man kann jetzt nur noch auf sie reagieren (wie z.B. im Click()-Event).
Die Zipdatei enthält auch ein Beispielprojekt
Geschrieben wurde die Klasse von Konrad Rudolph
Download cHook.zip [3090 Bytes]
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.