I have this code in a Module (warning not a safe subclass routine be careful) :
VB Code:
  1. Option Explicit
  2.  
  3. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  4.  
  5. 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
  6.  
  7. Public Const GWL_WNDPROC = (-4)
  8. Dim PrevProc As Long
  9. Private Const WM_CLOSE = &H10
  10.  
  11. Public Sub HookForm(FormName As Form)
  12. PrevProc = SetWindowLong(FormName.hWnd, GWL_WNDPROC, AddressOf WindowProc)
  13. End Sub
  14.  
  15. Public Sub UnHookForm(FormName As Form)
  16. SetWindowLong FormName.hWnd, GWL_WNDPROC, PrevProc
  17. End Sub
  18.  
  19. Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  20. If uMsg = WM_CLOSE Then Beep ' <- I want my actions here but to simplify it I remove my code & added Beep.
  21. WindowProc = CallWindowProc(PrevProc, hWnd, uMsg, wParam, lParam)
  22. End Function

& this for the Form :
VB Code:
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4. HookForm Me
  5. End Sub
  6.  
  7. Private Sub Form_Unload(Cancel As Integer)
  8. UnHookForm Me
  9. End Sub

Detecting the WM_CLOSE message doesn't work for me , I tried WM_DESTROY = &H2 and WM_NCDESTROY = &H82 but nothing work , for testing I tried WM_SYSCOMMAND = &H112 and it work with any system command , my question is what I missed in that routine & how I can make it work????