Making a Form Always on Top

Hello I need a function that will make a passed in form always on top of the application, but not all windows.  Basically like a Find window.
Who is Participating?
movieguyConnect With a Mentor Commented:
' Declare the following API function in a module
Declare Function SetWindowWord Lib "User32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal nNewWord As Long) As Long

' Place the following code in the load event of the Mdi child
' form you want to keep on top of all the other child
' forms.
' Assuming the name of the Mdi main form is mdiMain.  You will
' have to change names as needed.
SetWindowWord Me.hWnd, -8, mdiMain.hWnd

In form 1,
Form2.Show, me

This will keep form2 always on top of form1

Dont you use VBmodal ????

7 new features that'll make your work life better

It’s our mission to create a product that solves the huge challenges you face at work every day. In case you missed it, here are 7 delightful things we've added recently to monday to make it even more awesome.

cavacaspAuthor Commented:
That does not work it is giving me an invalid procedure call on that line.  One thing that I did not mention was that these forms are MDI Child Forms.  On thing that also is that the person needs to be able to switch between the two forms, just like they can on a Find form.
Use this :

Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cY As Long, ByVal wFlags As Long) As Long

Sub AlwaysOnTop(frmID As Form, OnTop As Integer)
   ' *** Pass any non-zero value to Place on top
   ' *** Pass zero to remove top-mostness

   Const SWP_NOMOVE = 2
   Const SWP_NOSIZE = 1
   Const flags = SWP_NOMOVE Or SWP_NOSIZE
   Const HWND_TOPMOST = -1
   Const HWND_NOTOPMOST = -2

   If OnTop Then
      OnTop = SetWindowPos(frmID.hWnd, HWND_TOPMOST, 0, 0, 0, 0, flags)
      OnTop = SetWindowPos(frmID.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, flags)
   End If

End Sub

cavacaspAuthor Commented:
Two things

1) Does not work with MDI Child forms.  I can get around this if necessary even though I would prefer to make the second form a MDI Child form.

2) I only want the Always on top attribute to be application wide.  If you pull up a find box it only stays on top of the application not every program that is currently running on the computer.

use this function

Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

when load a form use:

SetWindowPos hwnd, -1, 0, 0, 113, 290, conSwpNoActivate Or conSwpShowWindow

cavacaspAuthor Commented:
What is
conSwpNoActivate Or conSwpShowWindow
I'm getting variable not defined when it gets to this point.

Also how would I go about taking the always on top attribute off.
cavacaspAuthor Commented:
I need to get and answer to this question. So I have to reject it because you are not answering my comment.  If you can answer my comment then feel free to resubmit and I'll be happy to award you the points.
Now If I understand this correctly.....
1. You are using a MDI form
2. You want a specific MDI Child to remain on top

then there is a simple answer
Private Sub form_lost focus
End sub

Is this what you want??

cavacaspAuthor Commented:
Which form would I put this code on the one that I want to stay on top or the one beneath it.
Oh sorry.... the one you want to keep on top.. :) I guess I should have mentioned that !

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.