Module subclasser

Description

J'ai posté il y a quelques temps une Dll permettant de subclasser facilement.
Pourtant, mon avis sur la chose, et qu'elle ne doit aider qu'a la mise au point du Code.

Je vous propose là un module, que vous pouvez utiliser pour Subclasser dans vos programmes, sans ajouter de dépendance.

Source / Exemple :


Option Explicit

'# Permet de s'assurer que l'objet Form1 implémente bien WindowProc
Implements ISubclasser

'# boîte noire qui stocke les données du Subclassing.
'# ne pas modifier les valeurs si vous ne savez pas ce que vous faites...
Private mtSubClasser As SubClassedWindow

Private Const SC_MINIMIZE As Long = &HF020&

Private Sub Form_Initialize()
    '# Démarre le SubClassing. Les parametres sont:
    '# mtSubClasser, qui permet de stocker des infos sur le subclassing
    '# Me : c'est la variable qui va recevoir les messages, en l'occurrence, c'est la Form1
    '# Me.hWnd : handle de la fenêtre qui est prise pour cible ; celle dont on va recevoir 
les messages.
    '# True : ProtectIDE. Permet de mettre le subclassing en pause en même temps que l'IDE et ainsi vous protéger des crash
    InitiateSubClassing mtSubClasser, Me, Me.hWnd, True
End Sub

Private Sub Form_Terminate()
    '# On clos le subclassing
    '# on retrouve mtSubClasser, qui contient les infos nécessaires pour fermer le subclassing
    TerminateSubClassing mtSubClasser
End Sub

Private Function ISubclasser_WindowProc(ByVal hWnd As Long, ByVal uMsg As MessageConstants, ByVal wParam As Long, ByVal lParam As Long) As Long
    '# On affiche les messages reçus dans la fenêtre d'execution
    Debug.Print Timer, MessageText(uMsg), wParam, lParam
    If uMsg = WM_SYSCOMMAND And wParam = SC_MINIMIZE Then
        MsgBox "Reduction de la fenêtre interceptée, et annulée.", vbInformation
        '# Annulée, car non transmise via 'CallOldProc'
    Else
        '# On transmet le message a la procédure standard de traitement des messages.
        ISubclasser_WindowProc = CallOldProc(mtSubClasser, hWnd, uMsg, wParam, lParam)
    End If
End Function

Conclusion :


Je me suis inspiré du code de EBArtSoft pour le principe.
Le code Asm est partiellement issu de ce que m'a proposé Visual Studio 2005.

L'interêt par rapport a la source de notre ami EB ?
- l'IDE ne crashes pas en debug ou si l'on presse STOP (Quand ProtectIDE est activé)
- on a plus de liberté: l'utilisation de ISubClasser permet de placer la windowproc où l'on veut dans le code
- le code d'initialisation a placer dans l'objet cible est plus court et simple à reproduire
- Possibilité de filtrer les messages à recevoir.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.