The following code will put a Form always behind/at the bottom of all top-level windows. This is accomplished by processing the WM_WINDOWPOSCHANGING message.
Usage example:
Code:
Option Explicit 'In a standard .BAS module
Private Declare Function DefSubclassProc Lib "comctl32.dll" Alias "#413" (ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowSubclass Lib "comctl32.dll" Alias "#410" (ByVal hWnd As Long, ByVal pfnSubclass As Long, ByVal uIdSubclass As Long, Optional ByVal dwRefData As Long) As Long
Private Declare Function RemoveWindowSubclass Lib "comctl32.dll" Alias "#412" (ByVal hWnd As Long, ByVal pfnSubclass As Long, ByVal uIdSubclass As Long) As Long
Private Declare Sub PutMem4 Lib "msvbvm60.dll" (ByVal Ptr As Long, ByVal Value As Long)
Public Function Subclass(ByRef Frm As VB.Form) As Boolean
Subclass = SetWindowSubclass(Frm.hWnd, AddressOf SubclassProc, ObjPtr(Frm))
End Function
Public Function UnSubclass(ByRef Frm As VB.Form) As Boolean
UnSubclass = RemoveWindowSubclass(Frm.hWnd, AddressOf SubclassProc, ObjPtr(Frm))
End Function
Private Function SubclassProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long, ByVal uIdSubclass As Long, ByVal dwRefData As Long) As Long
Const WM_WINDOWPOSCHANGING = &H46&, HWND_BOTTOM = 1&, SIGN_BIT = &H80000000
If uMsg <> WM_WINDOWPOSCHANGING Then
SubclassProc = DefSubclassProc(hWnd, uMsg, wParam, lParam)
Else
PutMem4 (lParam Xor SIGN_BIT) + 4& Xor SIGN_BIT, HWND_BOTTOM 'WINDOWPOS.hWndInsertAfter = HWND_BOTTOM
End If 'Xor: Unsigned pointer arithmetic
End Function
Code:
Option Explicit 'In Form1
Private Sub Form_Load()
Subclass Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnSubclass Me
End Sub