Option Explicit

'In a module

' Subclassing form size

' API's
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
Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long)
Declare Function SetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

' Constants
Const WM_GETMINMAXINFO As Long = &H24
Global Const GWL_WNDPROC = (-4)

' Types
Private Type POINTAPI
  X As Long
  Y As Long
End Type

Private Type MINMAXINFO
  ptReserved As POINTAPI
  ptMaxSize As POINTAPI
  ptMaxPosition As POINTAPI
  ptMinTrackSize As POINTAPI
  ptMaxTrackSize As POINTAPI
End Type

' misc variabels
Private SizeInfo As MINMAXINFO
Public lngOldProc As Long
Dim ResY As Long
Dim ResX As Long


Public Function SubClass_Proc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    
    If uMsg = WM_GETMINMAXINFO Then
        Call RtlMoveMemory(ByVal lParam, SizeInfo, LenB(SizeInfo)) ' Set the new size info for my form
    Else
        SubClass_Proc = CallWindowProc(lngOldProc, hWnd, uMsg, wParam, lParam) ' go on as normal if the uMsg isnt resizing
    End If
    
End Function
Public Sub SetMaxMin()
With SizeInfo
    ' Maximised position
      .ptMaxPosition.X = 100
      .ptMaxPosition.Y = 100
    
    'Maximized size
      .ptMaxSize.X = 640
      .ptMaxSize.Y = 480

    'Maximum size with re-sizing
      .ptMaxTrackSize.X = 640
      .ptMaxTrackSize.Y = 480

    'Minimum size with re-sizing
      .ptMinTrackSize.X = 320
      .ptMinTrackSize.Y = 280

  End With
End Sub


'In the form
'At load
SetMaxMin
lngOldProc = SetWindowLongA(Me.hWnd, GWL_WNDPROC, AddressOf SubClass_Proc)

'At unload
SetWindowLongA Me.hWnd, GWL_WNDPROC, lngOldProc