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 :
Qualcuno è in grado di dirmi come mai non mi passa mai di li ...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


Rispondi quotando