Die Community zu .NET und Classic VB.
Menü

Klasse: Subclassing

 von 

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

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.