Ciao grazie a Massimo VB sono riuscito a creare una funzione di subclassing (intercettazione a priori degli eventi windows), purtroppo riscontro grossi problemi con il subClassing dell' evento KeyDown, in pratica non mi viene intercettato ..

HO una MDI e una frm Child nella quale avvio il subClassing e il KeyPreview è inpostato a true.

Codice :

codice:
Option Explicit
   Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long _
                            , ByVal ndx As Long, ByVal newValue As Long) As Long
   Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
                (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long _
                            , ByVal wParam As Long, ByVal lParam As Long) As Long
   Const GWL_WNDPROC = -4                           ' Per "SetWindowLong"
   Private SaveHWnd As Long                         ' L'Handle della finestra subclassata
   Private OldProcAddr As Long                      ' L'indirizzo della WindowProcedure originale
   ' Le costanti di messaggi
   Const WM_KILLFOCUS = &H8
   Const WM_SETFOCUS = &H7
   Const WM_SYSKEYDOWN = &H104
   Const WM_SYSKEYUP = &H105
   Const WM_ACTIVATEAPP = &H1C                      ' Applicazione attivata (wParam) o disattivata
   Const WM_KEYDOWN = &H100                         ' KeyDown
   Const WM_KEYUP = &H101                           ' KeyUp
   Const WM_LBUTTONDBLCLK = &H203                   ' Doppio click Sx
   Const WM_LBUTTONDOWN = &H201                     ' MouseDown Sx
   Const WM_LBUTTONUP = &H202                       ' MouseUp Sx
   Const WM_MBUTTONDBLCLK = &H209                   ' Doppio click Middle
   Const WM_MBUTTONDOWN = &H207                     ' MouseDown Middle
   Const WM_MBUTTONUP = &H208                       ' MouseUp Middle
   Const WM_MOUSEMOVE = &H200                       ' MouseMove
   Const WM_MOUSEWHELLSCROLL = &H20A                ' (manca in API Loader) Scroll di rotellina Mouse wParam > 0 = su; wParam < 0 = giù
   Const WM_MOVE = &H3                              ' La Finestra è stata mossa
   Const WM_NULL = &H0                              ' Messaggio NULLO
   Const WM_PAINT = &HF                             ' Ridisegno della finestra
   Const WM_RBUTTONDBLCLK = &H206                   ' Doppio-click Dx
   Const WM_RBUTTONDOWN = &H204                     ' MouseDown Dx
   Const WM_RBUTTONUP = &H205                       ' MouseUp Dx
   Const WM_SHOWWINDOW = &H18                       ' La finestra è stata mostrata
   Const WM_SIZE = &H5                              ' La finestra è stata ridimensionata
   Const WM_SYSCOLORCHANGE = &H15                   ' modifiche ai colori di sistema
   Const WM_SYSCOMMAND = &H112                      ' comando di sistema (un menu di sistema, un pulsante: chiudi, minimizza...)
   Const WM_TIMECHANGE = &H1E                       ' modificate le impostazioni di data e ora del sistema
   Const WM_TIMER = &H113                           ' evento del Timer (creato con CreateTimer)
Sub StartSubclassing(ByVal hWnd As Long)
   ' Avvia il SubClassing
   SaveHWnd = hWnd                  ' Memorizza Hanlde Window della finestra da subclassare per ripristinarlo poi
   ' Modifica l'indirizzo della Window Procedure originale a quello della Function "WndProc"
   ' e memorizza in "OldProcAddr" quello originale.
   OldProcAddr = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Sub StopSubclassing()
   ' Termina il SubClassing reimpostando l'indirizzo di Window Procedure originale
   SetWindowLong SaveHWnd, GWL_WNDPROC, OldProcAddr
End Sub

' Window Procedure personalizzata:
Function WndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    ' Gestisce il messaggio ricevuto
    Select Case uMsg
        Case WM_SYSCOMMAND:
            
        Case WM_SETFOCUS:
            
        Case WM_KILLFOCUS:
        
        Case WM_KEYDOWN:
            Select Case wParam
                Case "VK_PAGEDOWN":
                    MsgBox lParam
            End Select
        Case WM_KEYUP:
        
        Case WM_SYSKEYDOWN:
            
    End Select
   ' Invia il messaggio ricevuto alla Window Procedure originale, e
   ' restituisce a Windows il suo valore di ritorno.
   ' N.B: Questo è necessario per far si che Windows abbia conferma che l'evento
   '      comunicato alla Window (tramite messaggio) è stato intercettato e gestito.
   WndProc = CallWindowProc(OldProcAddr, hWnd, uMsg, wParam, lParam)
End Function
Qualcuno è in grado di dirmi come mai non mi passa mai di li ...