Più che a tentativi ad esperimenti
sicuramente non so esattamente a che risultato mi porteranno questi tentativi ma credo che imparare cose nuove serva sempre.
rispondendo alla tua domanda sulla function SetwindowLongPtrA si gli alias sono giusti, qui sotto ti metto tutto il codice
SUBCLASS nel modulo
Option Compare Database
Option Explicit
'WIN 64
Public Declare PtrSafe Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As LongPtr, ByVal hwnd As LongPtr, _
ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
Public Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
Public Const WM_SYSCOMMAND = &H112
Public Const SC_MINIMIZE = &HF020&
Public Const SC_MAXIMIZE = &HF030&
Public Const SC_RESTORE = &HF120&
Public Const GWL_WNDPROC As Long = (-4)
Public OldWinProc As LongPtr
Public Function NewWndProc(ByVal hwnd As LongPtr, ByVal msg As Long, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
Dim mret As Boolean
Dim retVal As LongPtr
Select Case uMsg
Case WM_SYSCOMMAND
mret = Forms!AbilitaMessaggi.GetMessage(msg, wParam)
If mret Then Exit Function
retVal = CallWindowProc(OldWinProc, hwnd, msg, wParam, lParam)
Case Else
retVal = CallWindowProc(OldWinProc, hwnd, msg, wParam, lParam)
End Select
NewWndProc = retVal
End Function
CODICE nella MASCHERA AbilitaMessaggi
Option Explicit
Private Sub Form_Load()
' Attivazione del SubClassing sulla Form
OldWinProc = SetWindowLongPtr(Me.hwnd, GWL_WNDPROC, AddressOf NewWndProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
'SetWindowLongPtr Me.hwnd, GWL_WNDPROC, OldWinProc
End Sub
Public Function GetMessage(ByVal uMsg As Long, ByVal wParam As LongPtr) As Boolean
Select Case uMsg
Case WM_SYSCOMMAND
Select Case wParam
Case SC_MINIMIZE
Me.lstMessage.AddItem "Ricevuto SC_MINIMIZE = " & SC_MINIMIZE & IIf(ck_SC_MINIMIZE, " Attivo", " Disattivato")
GetMessage = Not ck_SC_MINIMIZE
Case SC_MAXIMIZE
Me.lstMessage.AddItem "Ricevuto SC_MAXIMIZE = " & SC_MAXIMIZE & IIf(ck_SC_MAXIMIZE, " Attivo", " Disattivato")
GetMessage = Not ck_SC_MAXIMIZE
Case SC_RESTORE
Me.lstMessage.AddItem "Ricevuto SC_RESTORE = " & SC_RESTORE & IIf(ck_SC_RESTORE, " Attivo", " Disattivato")
GetMessage = Not ck_SC_RESTORE
Case Else
GetMessage = False
End Select
End Select
End Function
Appena clicco sulla maschera va in Crash
ho anche visto in giro che la costante GWL_WNDPROC dovrebbe essere GWLP_WNDPROC in 64 bit ma il risultato è lo stesso
Crash