How to Create a System-Modal Program/Window in Visual Basic

ID Number: Q72674

1.00

WINDOWS

Summary:

From a Visual Basic program, you can disable the ability to switch to

other Windows programs by calling the Windows 3.0 API function

SetSysModalWindow.

This information applies to Microsoft Visual Basic programming system

version 1.0 for Windows.

More Information:

Microsoft Windows is designed so that the user can switch between

applications without terminating one program to run another program.

There may be times when the program needs to take control of the

entire environment and run from only one window, restricting the user

from switching to any other application. An example of this is a

simple security system, or a time-critical application that may need

to go uninterrupted for long periods of time.

Passing the handle to the window through the argument of

SetSysModalWindow will limit the user to that particular window. This

will not allow the user to move to any other applications with the

mouse or use ALT+ESC or CTRL+ESC to bring up the Task Manager. You can

even remove the system menu if you do not want the user to exit

through the ALT+F4 (Close) combination.

All child windows that are created by the system-modal window become

system-modal windows. When the original window becomes active again,

it is system-modal. To end the system-modal state, destroy the

original system-modal window.

Care must be taken when using the SetSysModalWindow API from within

the Visual Basic programming environment. Pressing CTRL+BREAK to get

to the [break] mode leaves your modal form with no way to exit unless

you restart your system. When using the SetSysModalWindow within the

environment, be sure to exit your application by destroying the window

with either the ALT+F4 in the system menu, or by some other means from

within your running program.

To use the SetSysModalWindow API function, declare the API call in

your global section, as follows:

Declare Function SetSysModalWindow Lib "User" (ByVal hwnd%) As Integer

At an appropriate place in your code, add the following:

Success% = SetSysModalWindow(hwnd)

Once this line is executed, your window will be the only window that

can get focus until that window is destroyed.

Note: Because Visual Basic was not designed with system modal

capabilities in mind, using a MsgBox, InputBox, or Form.Show of

another form from a system modal window will not work correctly. If

you want to show another window from a system modal form, use another

Visual Basic form and call SetSysModalWindow for this second form

also, so that it becomes the system modal window. When the second form

is unloaded, the original system modal form will again become the

system modal window. Note that because the window(s) shown from a

system modal window must also call SetSysModalWindow, and since

MsgBox/InputBox windows cannot have associated code, you should not

call the MsgBox or InputBox functions from a system modal window.

Reference(s):

"Programming Windows: the Microsoft Guide to Writing Applications for

Windows 3," by Charles Petzold, Microsoft Press, 1990

"Microsoft Windows 3.0 Software Development Kit: Reference Volume 1"

WINSDK.HLP file shipped with Microsoft Windows 3.0 Software

Development Kit