AppOnTop

By | 2002-06-01

How do I get my application on top?To make your window truly topmost, use the SetWindowPos API call

Original Author: VB FAQ

Assumptions

You can, to make the application stay on top, put the ZOrder method in a Timer event repeatedly called, say, every 1000 milliseconds. This makes a “softer” on-top than other methods, and allows the user to make a short peek below the form.
There are two different Zorder’s of windows (forms) in Windows, both implemented internally as linked lists. One is for “normal” windows, the other for “topmost” windows (like the Clock application which is distributed with Windows). The ZOrder command above simply moves your window to the top of the “normal” window stack. There is another, independent stack for topmost windows – like those created by the example code above – which resolves problems if several of those should conflict.
Note that when a form is minimized, it loses its topmost attribute and you will have to set it again.

API Declarations



#IF WIN32 THEN
Declare Function SetWindowPos Lib “user32” Alias “SetWindowPos” _
(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
#ELSE ‘Win16
Declare Sub SetWindowPos Lib “User” (ByVal hWnd As Integer, _
ByVal hWndInsertAfter As Integer, ByVal X As Integer, _
ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, _
ByVal wFlags As Integer)
#END IF
Global Const SWP_NOMOVE = 2
Global Const SWP_NOSIZE = 1
Global Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Global Const HWND_TOPMOST = -1
Global Const HWND_NOTOPMOST = -2

Code

To set Form1 as a top-most form, do the following:

#IF WIN32 THEN
Dim lResult as Long
lResult = SetWindowPos (me.hWnd, HWND_TOPMOST, _
0, 0, 0, 0, FLAGS)
#ELSE '16-bit API uses a Sub, not a Function
SetWindowPos me.hWnd, HWND_TOPMOST, _
0, 0, 0, 0, FLAGS
#END IF

To turn off topmost (make the form act normal again), do the following:

#IF WIN32 THEN
Dim lResult as Long
lResult = SetWindowPos (me.hWnd, HWND_NOTOPMOST, _
0, 0, 0, 0, FLAGS)
#ELSE '16-bit API uses a Sub, not a Function
SetWindowPos me.hWnd, HWND_NOTOPMOST, _
0, 0, 0, 0, FLAGS
#END IF

If you don't want to force a window on top, which will prevent the user from seeing below it, but simply want to move a Window to the top for the user's attention, do this:

Form1.ZOrder

Author: dwirch

Derek Wirch is a seasoned IT professional with an impressive career dating back to 1986. He brings a wealth of knowledge and hands-on experience that is invaluable to those embarking on their journey in the tech industry.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.